将 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);
是唯一的选择吗?我怀疑一定有一种更简单的方法。
最佳答案
merge 不会修改其参数。它将状态从其参数复制到其参数的附加版本,并返回附加版本。因此你应该使用
foo = em.merge(foo);
// ...
return foo;
关于jpa - 在 EclipseLink 中使用 @Version 注释跟踪对象的最后更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8616819/