Я пытаюсь реализовать UserVersionType для управления типом версии, у меня есть код ниже, и он не достигает начального/следующего метода.
Я проверил весь связанный импорт, добавил журналы, включил журналы гибернации, проверил версию гибернации
при вызове Repo.save() он вызывает метод replace из ManagedVersion, но dosent callseed или next.
Любые лиды приветствуются.
@Entity
@Getter
@Setter
@Log4j2
@Table(name = "tab1")
//Filter added to retrieve only records that have not been soft deleted.
@Where(clause="deleted = 'f'")
@FieldNameConstants
@JsonIdentityInfo(generator= ObjectIdGenerators.IntSequenceGenerator.class)
public class tab1 implements Persistable, Cloneable {
@Version
@Type( type = "com.ManagedVersion")
@Generated(GenerationTime.ALWAYS)
@Column(name = "version")
private Long version = 0L;
@Column(updatable = false, insertable = false, name = "version")
private Long externallyGeneratedVersion = 2L;
@PostLoad
private void postLoad() {
externallyGeneratedVersion = 3L;
}
}
это класс управляемой версии
public class ManagedVersion implements UserVersionType {
private static final String ENTITY_ENTRY_CONTEXT = "entityEntryContext";
private static final String HEAD = "head";
private static final String EXTERNALLY_GENERATED_VERSION = "externallyGeneratedVersion";
private static final String HIBERNATE_GET_ENTITY_INSTANCE = "$$_hibernate_getEntityInstance";
@Override
public Object seed(SharedSessionContractImplementor session) throws HibernateException {
log.error("action=seed state=info message=\"seed\"");
Long externallyGeneratedVersion = getExternallyGeneratedVersion(session);
if (externallyGeneratedVersion == null) {
return 0L;
} else {
return externallyGeneratedVersion;
}
//return 145L;
}
private Long getExternallyGeneratedVersion(SharedSessionContractImplementor session) throws HibernateException {
log.error("action=getExternallyGeneratedVersion state=info message=\"getExternallyGeneratedVersion\"");
Class managedEntityClass = ManagedEntity.class;
Class entityEntryContextClass = EntityEntryContext.class;
Class baseOutputEntityClass = BaseOutputEntity.class;
Object externallyGeneratedVersion = null;
try {
Field entityEntryContextField = getField(StatefulPersistenceContext.class, ENTITY_ENTRY_CONTEXT);
Field headField = getField(entityEntryContextClass, HEAD);
Field externallyGeneratedVersionField = getField(baseOutputEntityClass, EXTERNALLY_GENERATED_VERSION);
java.lang.reflect.Method managedEntityMethod = managedEntityClass.getMethod(HIBERNATE_GET_ENTITY_INSTANCE, null);
EntityEntryContext entityEntryContextObject = (EntityEntryContext) entityEntryContextField.get(session.getPersistenceContext());
ManagedEntity managedEntity = (ManagedEntity) headField.get(entityEntryContextObject);
Object outputEntity = managedEntityMethod.invoke(managedEntity);
externallyGeneratedVersion = externallyGeneratedVersionField.get(outputEntity);
} catch (Exception e) {
throw new RuntimeException("Error extracting externallyGeneratedVersion.", e);
}
return (Long) externallyGeneratedVersion;
}
private Field getField(Class classType, String fieldName) throws NoSuchFieldException {
Field field = classType.getDeclaredField(fieldName);
field.setAccessible(true);
return field;
}
@Override
public Object next(Object current, SharedSessionContractImplementor session) throws HibernateException{
log.error("action=next state=info message=\"next\"");
Long externallyGeneratedVersion = getExternallyGeneratedVersion(session);
if (externallyGeneratedVersion == null) {
return ((Long) current) + 7;
} else {
if (externallyGeneratedVersion 0 ? names[0] : "0");
if (rs.wasNull()) {
return 0L;
} else {
return value;
}
} catch (Exception e) {
throw new RuntimeException("Error getting value from ResultSet.", e);
}
}
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException {
Long longValue = 0L;
if (value instanceof String) {
longValue = Long.valueOf((String) value);
} else if (value instanceof Long) {
longValue = (Long) value;
}
try {
st.setLong(index, longValue);
} catch (Exception e) {
throw new RuntimeException("Error setting value on PreparedStatement.", e);
}
}
@Override
public Object deepCopy(Object value) throws HibernateException {
Long longValue = 0L;
if (value instanceof String) {
longValue = Long.valueOf((String) value);
} else if (value instanceof Long) {
longValue = (Long) value;
}
return longValue;
}
@Override
public boolean isMutable() {
return true;
}
@Override
public Serializable disassemble(Object value) throws HibernateException {
return (Serializable) deepCopy(value);
}
@Override
public Object assemble(Serializable cached, Object owner) throws HibernateException {
return deepCopy(cached);
}
@Override
public Object replace(Object original, Object target, Object owner) throws HibernateException {
log.error("action=replace state=info message=\"replace\"");
return deepCopy(original);
}
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... ng-replace
Hibernate + UserVersionType Java не вызывает семя /next, но вызывает replace() ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение