当前位置: 首页 > 面试题库 >

EclipseLink JPA`@ PreUpdate`调用不持久

云煌
2023-03-14
问题内容

我在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。



 类似资料:
  • 我有一个实体: 而听众: 我正在使用为这个实体(1.4.1)和EclipseLink生成的Spring Data。代码行为如下所示: 这个问题在2009年已经有人描述过了,但是他们没有提出任何解决方案。不知道有没有人有办法解决?

  • 使用sping-boot-starter-data-mongob时,包含和使用的正确方法是什么? 我的pom。xml依赖项 我的类路径没有看到以下任何JPA注释:

  • 问题内容: 我有以下课程: 我的所有实体类都使用该类。 所以我有以下课程 和 因此,当我创建一个新客户时,出现以下错误: 我在这里做错了。 问题答案: 至少在使用JPA 的API 时,and 回调确实在…中工作,这在您的情况下还不清楚。 您在使用还是API?在后一种情况下,使用注解的方法,从JPA注释将不会被调用(和我的建议是使用监听器或拦截器)。

  • 井。我交叉编译了android的qemu,当我使用用户模式运行程序时,它显示有一个不受支持的ioctl调用。例如,我运行: 它给了我 因此,我认为我可能想要做的是手动添加ioctl调用。但问题是我只知道cmd号码,我怎么能弄清楚我应该添加什么?谢谢!

  • 我们使用(spring Boot1.5)和与进行交互。我正在尝试所有DB调用,如insert和来执行加密/解密等操作。我尝试实现像这样的JPA回调,但当使用实现DB查询时,没有调用它们。另一方面,当我使用像save这样的CrudRepository方法时,JPA回调可以工作。 QueryDSL调用

  • 问题内容: 在我的应用程序中,我定义了以下类: 如果我尝试将新帖子添加到论坛实体,则数据库将通过回调正确更新字段。但是,如果我尝试使用以下代码更新发布实体: 仅帖子数据被更新,字段值不变。我认为方法应该有效,并更新论坛实体。这是错误还是我错过了什么? 问题答案: 这不是错误,即使快速尝试也可以达到您预期的效果。不利的消息是由于以下原因,不能保证它能正常工作: 从JPA 2.0规范的第93页: 通常