2016-07-25 43 views
4

我从规格中找到以下信息。但对于我这个不是英国人而言,这并不够清楚。是@PostRemove不交易?

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

我的问题是任何交易相关的工作可以回滚后@PostRemove

比方说,我的实体将删除@PostRemove

class MyEntity { 

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

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

+0

似乎有关:http://stackoverflow.com/questions/4895854/jpa-postpersist-postupdate-transaction?rq=1 – MWiesner

回答

3

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

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

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

如果您想详细阐述它,并且您的应用程序正在Java EE容器中运行,那么您可能需要查看CDI events或甚至在jca adapter。如果您使用的是Spring,则可以注册TransactionSynchronizationAdapter,请参阅this answer

1

这取决于。

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

+0

使用'PreXXX'回调没有任何意义。这些文件在事务可能失败的时候被删除。 – frifle

+0

你说得对。没有足够重视具体的用例。更新。 – fny