如何在休眠中使用级联和反向? 定义它们的过程/标记是什么? 它们是否相互关联,它们有用吗?
答案 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
-包括所有级联操作;