2017-05-30 62 views
0

正常工作,我有一个基础的实体类@version标注不JPA/EclipseLink的

其中字段(时间戳)中的一个具有@版本属性,那么JPA会自动增加值。

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

我不是以编程方式设置编辑的值。

这里是我的实体类:

public class BaseEntity implements Serializable { 

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

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

// other fields, getters and setters 

} 

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

如果有人能帮我,将是巨大的

感谢

+0

检查值已在管理实体的事务提交后改变(或冲洗被调用)。常见的错误是查看分离实体中的值或者事务与数据库同步之前的值,因为JPA仅在即将访问数据库时更新值。否则,请提供有关您看到此问题的情况的更多信息,而不会看到它。 – Chris

回答

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"/> 

这将使测井精细,并产生大量的输出。您将能够看到更新查询以及发生了什么。

+0

嗨@XiCoN JFS, 感谢您的回答,它的正常工作,当我检查了近20至50条记录,但某些情况下,它的失败。 当我观察日志语句时,有正确的参数来更新时间戳值。 雅,我使用的唯一更新的实体。 –

+0

我个人从未遇到过这样的问题。你如何编辑你的'merge'函数来评估返回值。如果它不是期望的值,则创建一个对象的'System.out.println(obj)'。通过这种方式,您可以更仔细地了解实际发生的时间。你也可以考虑在项目中查找编辑过的字段的任何用法(getters和实际字段),看看是否真的没有任何操作这个字段的值。 –