Используя JPA с EclipseLink, я хотел бы отследить отметку времени последнего обновления, сделанного для экземпляра объекта.Предполагая, что это будет легко сочетать с оптимистической блокировкой, я определил сущность следующим образом:
import javax.persistence.Version;
[...]
@Entity
public class Foo {
@Id int id;
@Version Timestamp lastChange;
[...]
}
Обновление измененного объекта выполняется с помощью следующего кода:
EntityManager em = Persistence.createEntityManagerFactory("myConfiguration");
em.getTransaction().begin();
em.merge(foo);
em.getTransaction().commit();
ожидайте, что foo.lastChange
будет установлен на новую метку времени каждый раз, когда будет выполнено обновление измененного экземпляра.Однако, хотя поле LASTCHANGE
обновляется в базе данных, оно не обновляется в самом объекте .Таким образом, вторая попытка сохранить тот же объект снова не удалась с OptimisticLockException
.Я знаю, что EclipseLink позволяет выбирать между сохранением поля версии в кэше или непосредственно в объекте, и я убедился, что для конфигурации задано значение IN_OBJECT
.
Очевидный вопрос: как получить foo.lastChange
в поле установлено обновленное значение метки времени при сохранении в базу данных?
foo = em.find(Foo.class, foo.id);
будет единственным вариантом?Я подозреваю, что должен быть более простой путь к этому.