java - EclipseLink JPA `@PreUpdate` 调用不持久

标签 java jpa eclipselink

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

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

问题是我可以在调试器中看到正在调用该方法并且正在更新该字段,但是在我的数据库日志中我只看到一个 SQL 调用来更新已更改的字段,不包括更新时间戳字段。

使事情进一步复杂化 @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/

相关文章:

java - 如何在我的 RecyclerView 中显示来自 firebase 的子数据的子数据?

java - android getRelativeTimeSpanString() 错误?

java - 如何在spark sql中将json数组<String>转换为csv

java - 如何将实体及其关系存储在一起?

java - JPA 合并和创建的最佳实践

java - 提交事务后数据未更新

java - String.format() 获取最大值

java - 如何强制 Hibernate 保存无效值? (并不像听起来那么愚蠢)

Spring 数据: How to query a subtype using a specification

java - 如何关闭 persistence.xml 中的 eclipselink sql 语句日志记录?