gpt4 book ai didi

java - JPA @PreUpdate 未被调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:14:58 28 4
gpt4 key购买 nike

有人可以向我解释以下行为的原因吗?

EntityA 首先被创建,然后使用 em.persist(..) 方法持久化。 @PrePersist 回调在事务结束前执行。它工作正常。

在新事务中 EntityA 是使用 em 查询获得的。然后,执行一些修改其持久字段的操作,并结束该事务。但是在 em.flush() 上,@PreUpdate 方法不会被调用,@PrePersist 也不会被调用(后者我预料到了)。为什么?

//编辑

那是失败前的痕迹。 “完成实体化实体”是事务中第一个操作失败的结果。

DEBUG: org.hibernate.engine.internal.TwoPhaseLoad - Done materializing entity [com.example.entity#1]
DEBUG: org.hibernate.event.internal.AbstractFlushingEventListener - Processing flush-time cascades
DEBUG: org.hibernate.ejb.AbstractEntityManagerImpl - Mark transaction for rollback
DEBUG: org.springframework.orm.jpa.JpaTransactionManager - Initiating transaction rollback
DEBUG: org.springframework.orm.jpa.JpaTransactionManager - Rolling back JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@341a736]
DEBUG: org.hibernate.engine.transaction.spi.AbstractTransactionImpl - rolling back
DEBUG: org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction - rolled JDBC Connection

谢谢!

最佳答案

在新事务中,如果您执行merge 更新EntityA 的状态,将调用@PrePersist。简单地修改 EntityA 的持久字段而不进行合并不会导致调用 @PrePersist

它与 @PreUpdate 类似,但是不能保证在实体被持久化然后在单个事务中修改时调用 PreUpdate 回调(这不是你的例子中的情况)。

如果您使用的是事务范围的容器管理的实体管理器,那么当事务结束时,这些实体就会分离。这很可能是您的第一笔交易完成时发生的情况。这些分离的实体将继续存在于它们被持久化的持久化上下文之外,但是这些实体的状态不再保证与数据库同步。为确保它们的状态同步,您应该在第二个事务中执行 merge。这将导致生成的实体由持久性上下文管理,从而能够与数据库同步。

如果您不喜欢这种行为,您可以选择使用扩展持久性上下文

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com