1

JPA 2.0 规范在第 95 页讨论了PrePersist和回调:PreRemove

在执行该实体的相应 EntityManager 持久和删除操作之前,会为给定实体调用 PrePersist 和 PreRemove 回调方法。对于已应用合并操作并导致创建新托管实例的实体,在将实体状态复制到托管实例后,将为托管实例调用 PrePersist 回调方法。这些 PrePersist 和 PreRemove 回调也将在这些操作级联到的所有实体上调用。PrePersist 和 PreRemove 方法将始终作为同步持久化、合并和删除操作的一部分被调用。

我的母语不是英语,所以我可能会误解另一个家伙会很清楚什么。或者报价可以使用一两个澄清。但我不明白:

PrePersist 和 PreRemove 回调是否在运行的 Java EE 应用程序的每个生命周期中只调用一次?

如果回调与对EntityManager#persist(java.lang.Object)EntityManager#remove(java.lang.Object)的调用完全同步,那么是的,我希望回调只被触发一次。我通常不会多次保留我的实体,也不会为了好玩而一遍又一遍地删除它们。唉,这“只是”我的推理。

但!假设您的代码将在新事务开始时持久化一个实体,然后在同一个事务中,您将实体与一些新的和非持久化的实体挂钩。在事务提交之前,通过对拥有实体的 EntityManager#persist 进行二次平滑调用,在所有这些关系上引发级联持久化操作是直观的,当然也没有错。在那种情况下..是否会再次调用 PrePersist 回调,第二次?

4

0 回答 0