Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 我如何理解CascadeType关键字?_Hibernate_Jpa_Cascade - Fatal编程技术网

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);