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/ 增加了一些自己的理解和总结

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

相关推荐

Java 数值相等判断详解(特别注意包装类型之间的比较)

Java数值类型分为基本类型,包装类型。基本类型:byte、short、 int、long、float和double包装类型:Byte、Short、Integer、Long、Float和Double数值比较可分为基本类型之间比较,基本类型与包装类类型比较,包装类型之间的比较。基本类型比较基本类型之间只能使用“==”做相等比较。比较结果就是数值是否相等。int a=1, 

Java Objects.hash()与自己实现的hashCode()比较

Java 7新增了Objects类,它为对象提供了一些便捷的静态方法,如equals(),hashCode(),hash(),compare(),toString()等等。这里比较一下Objects.hash()与自己实现的hashCode()。传统实现的hashCode@Override public int hashCode() {  &nbs

Python:有关IntEnum类型的比较

枚举类型的使用请参考:Python3.4 枚举类型的使用。我们在使用Enum定义枚举类型,枚举的成员不是整型,所以在做比较时不能使用如大于号(">"),小于号(“<”)作比较。只用做相等性比较。但直接和整型做相等比较,结果都为False。Python新增了IntEnum,IntEnum是允许和整型做比较,包括大小比较和值得相等比较。创建IntEnum定义I

Python避免使用“is”操作符比较integer数据

Python的is操作符实际上是比较的是对象的id值,id(obj)。a is b实际可以理解为id(a) == id(b)Python里保存了一个整型数组作为缓存,范围为-5到256,如果使用此范围的数据赋值,那么实际使用引用此数组的数据,所以获取这些范围数据的id值,同一个数是相同的。Python3.6>>>a=-5 >>&

Python比较字典的巧妙方法

Python里比较两个字典,可以比较两个字典有多少个是相同的键值对的。示例:>>> x = dict(a=1, b=6,c=3) >>> y = dict(a=2, b=2) >>> shared_items = set(x.items

JavaScript Async/Await和Promise的对比

从Node 8 LTS开始,Node完全支持Async/Await。这里通过示例的方式对比Async/Await和Promise。简单介绍下Async/Await:Async/Await是一种新的编写异步代码的方式。其他方式是回调或者Promise。Async/Await实质是构建在Promise之上,它不能用于纯的回调或者Node.js的回调中。和Promise一样,Async/Await是非阻

VS Code设置自动保存

 Visual Studio Code编辑文件,默认情况下自动保存是关闭的,我们必须手动保存它。这里介绍如何在 Visual Studio Code 中设置编辑器自动保存。设置自动保存在Visual Studio Code 找到与自动保存相关的设置。请单击“文件”菜单中的“首选项”,然后单击显示的子菜单中的“设置”。 将显示 Visual Studio Cod

JPA Hibernate 快速入门

为了学习JPA的实体状态的转化,我们先搭建一个通过JPA Hibernate存储实体到数据库的Demo,后续的学习都在此demo基础上展开。添加Hibernate依赖 <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager&l

JPA架构(JPA - Architecture)

今天我们来学习一下JPA的架构,首先问一个问题,大家学习理解一个架构有什么好的方法呢?对于我自己来说,我觉得架构图是理解架构最好的方式以上就是JPA的架构图,我们可以知道,JPA的主要部分包括五个类: 第一个类EntityManagerFactory,我们可以称为实体管理器工厂类,很显然,这个类的作用是创建和管理多个实体管理器类,因此,我们可以大胆猜测,实体管理器工厂类和实体管理器是一对