@PostRemove 是否退出交易?

Is @PostRemove out of transaction?

我从规范中找到了以下信息。但是对于非英语母语的我来说还不够清楚。

The PostPersist and PostRemove callback methods are invoked for an entity after the entity has been made persistent or removed. These callbacks will also be invoked on all entities to which these operations are cascaded. The PostPersist and PostRemove methods will be invoked after the database insert and delete operations respectively. These database operations may occur directly after the persist, merge, or remove operations have been invoked or they may occur directly after a flush operation has occurred (which may be at the end of the transaction). Generated primary key values are available in the PostPersist method.

我的问题是在 @PostRemove 之后可以回滚任何事务相关的作业吗?

假设我的实体在 @PostRemove

上删除了一些离线文件
class MyEntity {

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

有没有可能是那些离线文件从存储中删除了,实体还留在数据库中? (通过回滚?)

视情况而定。

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

是的,有可能你的文件被删除了,你的实体在回滚后仍然留在数据库中。 @PostRemove 笔交易中。

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

对于一个简单的解决方案,在数据库事务期间将文件移动到 to_be_deleted 文件夹中。因此,您可以使用回调方法。当 commit() 成功时,文件最终被删除,失败时被恢复。

如果您想详细说明一下并且您的应用程序 运行 在 java EE 容器中,那么您可能需要查看 CDI events or even at a jca adapter. If you are using Spring you can register a TransactionSynchronizationAdapter see this answer.