JPA vs Hibernate Cascade Types 比较
选中文字可对指定文章内容进行评论啦,绿色背景文字可以点击查看评论额。
Hibernate支持所有的JPA定义的CascadeTypes,下面的图可以说明它们之间的联系和区别。
JPA ENTITYMANAGER ACTION | JPA CASCADETYPE | HIBERNATE NATIVE SESSION ACTION | HIBERNATE NATIVE CASCADETYPE | EVENT LISTENER |
---|---|---|---|---|
detach(entity) | DETACH | evict(entity) | DETACH or EVICT | Default Evict Event Listener |
merge(entity) | MERGE | merge(entity) | MERGE | Default Merge Event Listener |
persist(entity) | PERSIST | persist(entity) | PERSIST | Default Persist Event Listener |
refresh(entity) | REFRESH | refresh(entity) | REFRESH | Default Refresh Event Listener |
remove(entity) | REMOVE | delete(entity) | REMOVE or DELETE | Default Delete Event Listener |
saveOrUpdate(entity) | SAVE_UPDATE | Default Save Or Update Event Listener | ||
replicate(entity, replicationMode) | REPLICATE | Default Replicate Event Listener | ||
lock(entity, lockModeType) | buildLockRequest(entity, lockOptions) | LOCK | Default Lock Event Listener | |
All the above EntityManager methods | ALL | All the above Hibernate Session methods | ALL |
从图表我们可以总结出:
- 在 JPA EntityManager 或 Hibernate Session 上调用 persist、merge 或 refresh 没有区别。
- JPA remove和detach调用委托给 Hibernate delete和detach本地操作。
- 只有 Hibernate 支持复制和 saveOrUpdate。虽然复制对于某些非常特定的场景很有用(当需要在两个不同的数据源之间镜像确切的实体状态时),持久化和合并组合总是比原生 saveOrUpdate 操作更好的选择。
根据经验,您应该始终
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/ 增加了一些自己的理解和总结
版权声明:著作权归作者所有。
大纲