0

大家好,

我无法理解 @Post 回调方法的确切行为。正如 ProJPA 书中提到的“当删除实体的 SQL 最终确实发送到数据库时,将触发 PostRemove 事件。与 PostPersist 生命周期事件一样,PostRemove 事件并不能保证成功。封闭事务可能仍然是回滚”。

我关心的是,如果 SQL DELETE 语句已经触发,那么事务将如何回滚?如果 SQL DELETE 语句无法删除对象,则会引发异常并且不会执行 @PostDelete。那么,在什么场景下事务可以回滚??

谢谢大家的时间!!

4

1 回答 1

1

根据 JPA 规范:@PostRemove 回调在 EntityManager 上的删除操作之后执行。

要理解的关键点是,如果删除失败,EntityManager 上的删除操作不会抛出异常。事务可能会被标记为“Rollback-Only”(即表示事务结束时事务将被回滚……并且事务结束时会抛出异常)。

JPA 规范表明@PostRemove 回调将被执行(当然与删除操作在同一事务中),而不管标志“Rollback-Only”如何。

这意味着您可以在 @PostRemove 中执行额外的数据库操作:这些操作将是同一事务的一部分(如果出现问题,也会回滚)。并且推论:如果在 @PostRemove 期间将事务标记为仅回滚:将不会在您的数据库上执行删除操作。

于 2013-09-12T10:35:41.313 回答