@PostRemove退出交易吗?

时间:2016-07-25 06:44:25

标签: jpa lifecycle

我从规范中找到了以下信息。但对于我不是英国人的人来说,这还不够明确。

  

在实体被持久化或删除后,将为实体调用PostPersistPostRemove回调方法。这些回调也将在这些操作级联的所有实体上调用。分别在数据库插入和删除操作之后将调用PostPersistPostRemove方法。这些数据库操作可能在调用了持久,合并或删除操作后直接发生,或者可能在刷新操作发生后直接发生(可能在事务结束时)。生成的主键值在PostPersist方法中可用。

我的问题是,在@PostRemove之后可以回滚任何与交易相关的工作吗?

我们假设我的实体删除了@PostRemove

上的一些脱机文件
class MyEntity {

    @PostRemove
    private void onPostRemove() {
        // delete offline files related to this entity
        // not restorable!
    }
}

是否有可能从存储中删除那些脱机文件,实体仍然留在数据库中? (通过回滚?)

2 个答案:

答案 0 :(得分:4)

是的,您的文件可能会被删除,并且您的实体在回滚后仍然留在数据库中。 @PostRemove在交易中是

如果您想要绝对确定您的文件被删除当且仅当事务成功完成时,您应该在commit()成功后不使用回调方法删除文件。但是,如果您还需要确保当且仅当文件被删除时才删除该实体,那么您就会遇到问题。您需要一种以事务方式访问文件系统。

对于简单的解决方案,在db-transaction期间将文件移动到to_be_deleted - 文件夹中。因此,您可以使用回调方法。当commit()成功并在失败时恢复时,最终会删除这些文件。

如果您想进一步详细说明并且您的应用程序在Java EE容器中运行,那么您可能希望查看CDI events或甚至jca adapter。如果您使用的是Spring,则可以注册TransactionSynchronizationAdapter,然后查看this answer

答案 1 :(得分:1)

取决于。

如果您正在使用多次刷新(EntityManager#flush()),则仍可以回滚该事务。否则,在数据库事务完成后执行前缀为Post的任何回调。