使用EclipseLink中的@Version注释跟踪对象的最后更改

时间:2011-12-23 13:47:48

标签: jpa eclipselink

将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 个答案:

答案 0 :(得分:3)

merge不会修改其参数。它将状态从其参数复制到其参数的附加版本,并返回附加的版本。你应该这样使用

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