Hibernate 我如何理解CascadeType关键字?
我认为Hibernate 我如何理解CascadeType关键字?,hibernate,jpa,cascade,Hibernate,Jpa,Cascade,我认为CascadeType关键字与EntityManager的操作有关 但这些代码让我困惑。 代码如下所示。(为非常简单的代码感到抱歉) 运行后,插入父、子1、子2。 在这里之前一切都很好,这是我所期待的 Parent foundParent = em.merge(parent); // parent has identifier Child child1 = new Child(); Child child2 = new Child(); parent.addChild(child1);
CascadeType
关键字与EntityManager
的操作有关但这些代码让我困惑。
代码如下所示。(为非常简单的代码感到抱歉) 运行后,插入父、子1、子2。
在这里之前一切都很好,这是我所期待的
Parent foundParent = em.merge(parent); // parent has identifier
Child child1 = new Child();
Child child2 = new Child();
parent.addChild(child1);
parent.addChild(child2);
从这里。。我开始想em.perist!=CascadeType.PERSIST
和。。这个代码也是一样的
Parent foundParent = em.find(Parent.class, 1);
Child child1 = new Child();
Child child2 = new Child();
parent.addChild(child1);
parent.addChild(child2);
child1,child2也被插入
现在我很困惑。如果EntityManager的
操作与级联类型的操作不一样,我如何理解级联类型.合并
对不起,我的英语很短,谢谢你的阅读 大体上你是对的,但是规范(JPA 2.2,第3.2.4段)也包含以下规则:
应用于实体X的刷新操作的语义如下所示:
- 如果X是一个托管实体,它将与数据库同步
- 对于由X的关系引用的所有实体Y,如果已使用级联元素值cascade=PERSIST或cascade=all注释了与Y的关系,则持久化操作将应用于Y
因此,如果将一个子项添加到托管父项,并且用cascade=PERSIST注释父子实体,则插入该子项
规格是免费提供的。它们是行为的定义。因此,阅读它们是理解JPA工作原理的方法。一般来说,你是对的,但规范(JPA 2.2,第3.2.4段)也包含以下规则:
应用于实体X的刷新操作的语义如下所示:
- 如果X是一个托管实体,它将与数据库同步
- 对于由X的关系引用的所有实体Y,如果已使用级联元素值cascade=PERSIST或cascade=all注释了与Y的关系,则持久化操作将应用于Y
因此,如果将一个子项添加到托管父项,并且用cascade=PERSIST注释父子实体,则插入该子项
规格是免费提供的。它们是行为的定义。因此,阅读它们是理解JPA工作原理的一种方式。持久化和合并被设计为保持某个对象的一个托管实例的一种方式
如果使用persist,则意味着该对象还不存在,因此使其成为唯一的托管实例并不有害
使用“合并”时,需要考虑对象的托管实例可能已经存在。您不想替换那个唯一的托管实例,因为其他对象可能会引用它,认为它就是托管对象
如果在对象的过时版本上使用merge(将其作为参数传递给上一个merge),JPA将不知道如何找到正确的对象,因为它还没有id。假定它是一个新对象,并将创建新的托管实例
- CascadeType.PERSIST:CascadeType presist表示save()或PERSIST()操作级联到相关实体
- CascadeType.MERGE:CascadeType MERGE表示合并所属实体时合并相关实体
- CascadeType.REFRESH:CascadeType REFRESH对REFRESH()操作执行相同的操作
- CascadeType.REMOVE:CascadeType REMOVE删除拥有实体时与此设置关联的所有相关实体
删除
- 级联类型.分离:如果发生“手动分离”,级联类型分离将分离所有相关实体
- 级联类型。ALL:级联类型ALL是上述所有级联操作的简写
持久化和合并被设计为保持某个对象的一个托管实例的一种方式
如果使用persist,则意味着该对象还不存在,因此使其成为唯一的托管实例并不有害
使用“合并”时,需要考虑对象的托管实例可能已经存在。您不想替换那个唯一的托管实例,因为其他对象可能会引用它,认为它就是托管对象
如果在对象的过时版本上使用merge(将其作为参数传递给上一个merge),JPA将不知道如何找到正确的对象,因为它还没有id。假定它是一个新对象,并将创建新的托管实例
- CascadeType.PERSIST:CascadeType presist表示save()或PERSIST()操作级联到相关实体
- CascadeType.MERGE:CascadeType MERGE表示合并所属实体时合并相关实体
- CascadeType.REFRESH:CascadeType REFRESH对REFRESH()操作执行相同的操作
- CascadeType.REMOVE:CascadeType REMOVE删除拥有实体时与此设置关联的所有相关实体
删除
- 级联类型.分离:如果发生“手动分离”,级联类型分离将分离所有相关实体
- 级联类型。ALL:级联类型ALL是上述所有级联操作的简写
这意味着我的处境不是来自持久化
,而是来自刷新
。。正确的?看起来CascadeType.PERSIST的角色比其他的多。所有情况都可以从这个规范中解释。非常感谢。这意味着我的情况不是来自持久化
,而是来自刷新
。。正确的?看起来CascadeType.PERSIST的角色比其他的多。所有情况都可以从这个规范中解释。非常感谢。
Parent foundParent = em.find(Parent.class, 1);
Child child1 = new Child();
Child child2 = new Child();
parent.addChild(child1);
parent.addChild(child2);