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

标签 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);

是唯一的选择吗?我怀疑一定有一种更简单的方法。

最佳答案

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

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

关于jpa - 在 EclipseLink 中使用 @Version 注释跟踪对象的最后更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8616819/

相关文章:

database - 使用 JPA 时避免来自数据库的陈旧数据?

java - hibernate PersistentAttributeInterceptor使jointable不起作用

spring - JPA Native 查询在 INSERT INTO VALUES 中将 List 参数的括号错误

java - JPA OneToMany、ManyToOne 双向

java - 使用内连接时映射 NativeQuery 结果

mysql - JPA EclipseLink oneToMany 派生 ID 失败

java - Hibernate - Java8 函数对象可以保存在数据库中吗?

orm - JPA/EclipseLink - 计算列

jakarta-ee - JPA 数据库分隔符

jpa - querydsl 将多个查询合二为一