我从规范中找到了以下信息。但对于我不是英国人的人来说,这还不够明确。
在实体被持久化或删除后,将为实体调用
PostPersist
和PostRemove
回调方法。这些回调也将在这些操作级联的所有实体上调用。分别在数据库插入和删除操作之后将调用PostPersist
和PostRemove
方法。这些数据库操作可能在调用了持久,合并或删除操作后直接发生,或者可能在刷新操作发生后直接发生(可能在事务结束时)。生成的主键值在PostPersist
方法中可用。
我的问题是,在@PostRemove
之后可以回滚任何与交易相关的工作吗?
我们假设我的实体删除了@PostRemove
class MyEntity {
@PostRemove
private void onPostRemove() {
// delete offline files related to this entity
// not restorable!
}
}
是否有可能从存储中删除那些脱机文件,实体仍然留在数据库中? (通过回滚?)
答案 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
的任何回调。