Отслеживание последнего изменения объекта с помощью аннотации @Version в EclipseLink - PullRequest
2 голосов
/ 23 декабря 2011

Используя 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);

будет единственным вариантом?Я подозреваю, что должен быть более простой путь к этому.

1 Ответ

3 голосов
/ 23 декабря 2011

слияние не изменяет свой аргумент. Он копирует состояние из своего аргумента в прикрепленную версию своего аргумента и возвращает присоединенную версию. Таким образом, вы должны использовать

foo = em.merge(foo);
// ...
return foo;
...