【问题标题】:@version annotation not working properly in jpa/eclipselink@version 注释在 jpa/eclipselink 中无法正常工作
【发布时间】:2017-05-30 12:33:25
【问题描述】:

我有一个基础实体类

其中一个字段(Timestamp)有@version属性,所以Jpa会自动增加值。

但是,有时时间戳值没有得到更新,编辑日期小于创建日期,但这在理论上不应该发生。

我没有以编程方式设置 edited 值。

这是我的实体类:

public class BaseEntity implements  Serializable {  

@Column(name = "CREATED")
private Timestamp created;

@Column(name = "EDITED")
@Version
private Timestamp edited;

// other fields, getters and setters

}

看过很多关于这个@version注解的文章,但是我不明白为什么这个值不会更新,这背后的原因是什么。

如果有人帮助我,那就太好了

谢谢

【问题讨论】:

  • 在事务提交后检查托管实体中的值是否已更改(或已调用刷新)。常见的错误是查看分离实体中的值或在事务同步到数据库之前查看值,因为 JPA 仅在它即将进入数据库时​​更新值。否则,请提供有关您看到问题与未看到问题的情况的更多信息。
  • 谢谢@Chris。我实际上正在更改关联子实体之一的属性,但没有更改我拥有 @Version Timestamp version; 属性的父实体的属性,并且由于该版本属性未使用新时间戳进行更新。一旦我更改了父实体中的属性,版本属性就会获得新的时间戳。有用。请注意,切勿手动更新标有@version 的属性的值。每当实体的属性发生变化时,JPA 都会用新值更新它。

标签: java jpa eclipselink


【解决方案1】:

以下是一些基本准则:

  • 检查是否导入了正确的包javax.persistence.Version
  • 在保存对已持久化实体的更改时使用obj = entityManager.merge(obj);
  • 切勿手动更改版本字段的值。实体经理会处理它。

为了进一步调试,请编辑您的 persitence.xml 并将以下行添加到属性中:

<property name="eclipselink.logging.level" value="FINE"/>
<property name="eclipselink.logging.parameters" value="true"/>
<property name="eclipselink.logging.sql.level" value="FINE"/>

这将启用精细日志记录并生成大量输出。您将能够看到更新查询以及究竟发生了什么。

【讨论】:

  • 嗨@XiCoN JFS,感谢您的回答,当我检查了近 20 到 50 条记录时,它工作正常,但在某些情况下它失败了。当我观察日志语句时,有正确的参数来更新时间戳值。是的,我只使用更新的实体。
  • 我个人从来没有遇到过这样的问题。你如何编辑你的merge 函数来评估返回值。如果不是预期值,则为该对象创建一个System.out.println(obj)。通过这种方式,您可以更近距离地了解它实际发生的时间。此外,您可以考虑查看项目中 editedfield 的任何用法(getter 和实际字段),看看是否真的没有任何东西操纵该字段的值。
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 2016-03-26
相关资源
最近更新 更多