将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);
是唯一的选择吗?我怀疑必须有一个更简单的方法。
答案 0 :(得分:3)
merge不会修改其参数。它将状态从其参数复制到其参数的附加版本,并返回附加的版本。你应该这样使用
foo = em.merge(foo);
// ...
return foo;