cascade&和cascade之间有什么区别?在休眠中反过来,它们用于什么?

时间:2010-09-08 11:49:49

标签: java hibernate cascade inverse

如何在休眠中使用级联和反向? 定义它们的过程/标记是什么? 它们是否相互关联,它们有用吗?

3 个答案:

答案 0 :(得分:84)

通过中间表的多对多关系; “Cascade”表示是否将在子表中创建/更新记录。而“反向”表示是否将在中间表中创建/更新记录

e.g。假设下面的场景 1名学生可以拥有多部手机。所以学生班有手机套装的财产。 此外,1部电话可由多名学生拥有。因此,Phone类具有Set of Students的属性。 这个映射在stud_phone表中提到。

所以有三个表即。学生,电话和stud_phone(中间)表。 映射可能如下所示:

<set name="phoneset" table="stud_phone" cascade="save-update" inverse="true">
  <key column="mapping_stud_id">< /key>
  <many-to-many class="com.domain.Phone" column="mapping_phon_id"/>
</set> 

创建一个新的学生对象,并在其集合中添加两个新的手机对象。并调用session.save(student_obj)。 根据“级联”和“反向”设置,将触发不同的查询。

以下是级联和反向的不同组合及其影响。

1)CASCADE IS NONE且INVERSE为false

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)

2)CASCADE为NONE且INVERSE为真

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)

3)CASCADE是保存更新,INVERSE是假

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)

4)CASCADE是save-update和INVERSE true

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)

可以看出,只有当CASCADE进行保存更新时,记录才会在PHONE表中创建。否则不会。

当INVERSE为假(即学生是关系的所有者)时,更新了中间表STUD_PHONE。当inverse为true时,Phone是关系的所有者,因此即使创建了新学生,也不会更新中间表。

因此,在两个实体的关系的情况下,“级联”影响其他实体表,“反向”影响中间表。所以他们的影响是独立的。

答案 1 :(得分:26)

Different between cascade and inverse链接引用的信息:

  

<强> 1。逆:这用于决定哪一方是关系所有者   管理关系(插入或   更新外键列。)

     

<强> 2。级联:在级联中,经过一次操作(保存,更新和删除)后   完成后,它将决定是否需要   调用其他操作(保存,更新   和删除)在另一个实体上   彼此有关系。

     

结论:总之,“逆”   决定哪一方会更新   外键,而“级联”决定   操作的后续应该是什么   执行。两者看起来非常相似   在关系中,但它完全是两个   不同的东西。 Hibernate开发人员   值得花时间研究   它,因为误解了这个概念   或滥用它会带来严重的   性能或数据完整性问题   他们的申请。

另请查看此论坛主题:https://forum.hibernate.org/viewtopic.php?f=1&t=949041

答案 2 :(得分:3)

这些是正交的概念。

在关联中,必须使用#include <iostream> #define f cin #define g cout using namespace std; int T; long long n; int b; int main() { f >> T; for(int i = 1; i <= T; ++i) { f >> n >> b; int ans = 0; bool ok = true; while(n) { if(b == ans) { g << n % 2; ok = false; break; } n /= 2; ++ans; } if(ok) g << 0; } return 0; } 属性或inverse属性将其中一侧标记为逆(mappedBy / many关联中的one-to-many一侧以及many-to-one关联中的任何一方)。 Hibernate需要此信息来正确确定如何将Java类(面向对象的关联)映射到数据库表(关系关联)。

级联怎么样-您可以明确指定Hibernate对关联实体执行操作:

  • many-to-many-为所有者调用save()persist()方法时,还将保存所有关联的实体;
  • CascadeType.PERSIST-为所有者调用delete()方法时,所有关联的实体也会被删除;
  • CascadeType.REMOVE-为所有者调用merge()方法时,所有关联的实体也将合并为托管/持久状态; <​​/ li>
  • CascadeType.MERGE-为所有者调用refresh()方法时,所有关联的实体也在从其数据库表示形式刷新;
  • CascadeType.REFRESH-与该实体关联的会话关闭时,所有相关实体都将处于分离状态; <​​/ li>
  • CascadeType.DETACH-包括所有级联操作;
  • “孤立删除”-当该实体从关系中删除时,将从数据库中删除关联的实体。