Я использую jpa с hibernate (3.2.7) в качестве реализации orm.
Я изменил сущность, а затем слил ее.
У меня также есть @EntityListeners для этой сущности, чтобы гарантировать, что некоторый атрибут оценивается.
Если я изменю значение до слияния, а затем верну это значение в методе @PreUpdate в Listener, установив исходное значение, моя версия для результатов сущности увеличится, но для версии базы данных будет иметь предыдущее значение.
Я думаю, что это связано с тем, что объект не изменился, поэтому на БД он не обновляется, но версия объекта была увеличена без восстановления после сброса.
Чтобы объяснить лучше, у меня есть этот объект:
@Entity
@EntityListeners({MyListener.class})
public class MyEntity {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String myValue;
@Version
private Long version ;
}
и этот слушатель:
public class MyListener {
@PreUpdate
public void preUpdate(MyEntity ua) {
ua.setMyValue("default");
}
}
Теперь предположим, что у меня есть на БД объект со следующими значениями: (id = 1, myValue = 'defalut', version = 1). Я читаю этот объект, отсоединяюсь, передаю его клиенту и возвращаю его с помощью myValue = 'new' и выполняю операцию слияния (слушатель меняет myValue на 'default' и, таким образом, результат объекта остается неизменным в db), сбрасывается и выходит из транзакции (так стремится).
После этого я нахожу версию = 2 для моего объекта, но версию = 1 для базы данных.
Это ошибка в спящем режиме? Или ошибка Jpa?