我在StackOverflow上遇到了一些类似的问题,尝试了解决方案,但没有找到答案。

我正在使用一种相当通用的JPA策略来设置某些实体的上次修改时间。设置列和字段,然后使用@PreUpdate标记方法,并使其设置为等于当前时间。

问题是,我可以在调试器中看到正在调用该方法并且正在更新该字段,但是在我的数据库日志中,我仅看到一个SQL调用,以UPDATE更改字段,其中不包含timestamp字段的UPDATE。 。

进一步复杂化@PrePersist可以完美地工作,只有@PreUpdate可以证明这种行为。

到目前为止,我找到的最接近的解释是此LINK

类似问题在#1725699和#1745890

我正在使用EclipseLink v2和JPA v1来与GlassFish v2兼容。

我尝试直接在Entity类的方法上使用这两个注释,以及通过EntityListener注释附加到Entity类的@EntityListener

我怀疑这是EclipseLink中的错误,但我无法证明这一点。

是否带错,我非常希望这个简单的操作能够正常工作。这个实现有什么问题吗?这是EclipseLink中的已知问题吗?这是JPA中的已知问题吗?有没有解决的办法?

除了进入数据库和使用触发器之外,还有没有其他途径可以让我的Java代码设置updated_on时间戳?

谢谢你的建议!

代码段如下。

实体字段:

@Column(name = "updated_on")
@Temporal(TemporalType.TIMESTAMP)
private Date updatedOn;
@Column(name = "created_on")
@Temporal(TemporalType.TIMESTAMP)
private Date createdOn;

带注释的更新方法:
@PreUpdate
public void setUpdatedOn(Timestamped object) {
    object.setUpdatedOn(new Date());
}

@PrePersist
public void setCreatedOn(Timestamped object) {
    if (object.getCreatedOn()==null) {
      object.setCreatedOn(new Date());
    }
}

最佳答案

您提供的链接准确地描述了您的情况:对于脏检查,将在调用@PreUpdate方法之前检测到更新的字段,并且不再检测到@PreUpdate方法中的更改。这样做可能是出于性能方面的考虑,因为大对象图上的脏检查可能非常昂贵。现在看来,您的选择是使用特定于提供程序的机制(DescriptorEvent)或切换到Hibernate。

关于java - EclipseLink JPA `@PreUpdate`调用未持久,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1877499/

10-10 04:18