JPA vs Hibernate Cascade Types 比较

Hibernate支持所有的JPA定义的CascadeTypes,下面的图可以说明它们之间的联系和区别。

JPA ENTITYMANAGER ACTIONJPA CASCADETYPEHIBERNATE NATIVE SESSION ACTIONHIBERNATE NATIVE CASCADETYPEEVENT LISTENER
detach(entity)DETACHevict(entity)DETACH or EVICTDefault Evict Event Listener
merge(entity)MERGEmerge(entity)MERGEDefault Merge Event Listener
persist(entity)PERSISTpersist(entity)PERSISTDefault Persist Event Listener
refresh(entity)REFRESHrefresh(entity)REFRESHDefault Refresh Event Listener
remove(entity)REMOVEdelete(entity)REMOVE or DELETEDefault Delete Event Listener
  saveOrUpdate(entity)SAVE_UPDATEDefault Save Or Update Event Listener
  replicate(entity, replicationMode)REPLICATEDefault Replicate Event Listener
lock(entity, lockModeType) buildLockRequest(entity, lockOptions)LOCKDefault Lock Event Listener
All the above EntityManager methodsALLAll the above Hibernate Session methodsALL 

 

从图表我们可以总结出:

  • 在 JPA EntityManager 或 Hibernate Session 上调用 persist、merge 或 refresh 没有区别。
  • JPA remove和detach调用委托给 Hibernate delete和detach本地操作。
  • 只有 Hibernate 支持复制和 saveOrUpdate。虽然复制对于某些非常特定的场景很有用(当需要在两个不同的数据源之间镜像确切的实体状态时),持久化和合并组合总是比原生 saveOrUpdate 操作更好的选择。

根据经验,您应该始终对 TRANSIENT 实体使用 persist 并为 DETACHED 实体使用 merge

saveOrUpdate 的缺点(当将分离的实体快照传递给已经管理该实体的 Session 时)导致了合并操作的前身:现在已很少使用 saveOrUpdateCopy 操作。

  • JPA 锁定方法与 Hibernate 锁定请求方法具有相同的行为。
  • JPA CascadeType.ALL 不仅适用于 EntityManager 状态更改操作,还适用于所有 Hibernate CascadeTypes。

因此,如果您将关联映射到 CascadeType.ALL,您仍然可以级联 Hibernate 特定事件。例如,您可以级联 JPA 锁定操作(尽管它表现为重新附加,而不是实际的锁定请求传播),即使 JPA 没有定义 CascadeType.LOCK。

 

总结:

1、JPA和hibernate对Cascade的有三个是相同的,分别是persist,merge,refresh

2、Hibernage实现了一个复制的级联。

3、JPA的remove和detach是委托给hibernate本地操作,本质上应该也是一致的,也许有差别。这里存在疑问,有对这一块深入理解的可以留言?

 

注:本文翻译的文章来自:https://vladmihalcea.com/a-beginners-guide-to-jpa-and-hibernate-cascade-types/ 增加了一些自己的理解和总结

版权声明:著作权归作者所有。

thumb_up 0 | star_outline 0 | textsms 0