为了账号安全,请及时绑定邮箱和手机立即绑定

为什么这两句话都要写。

为什么双向的代码都要写啊?我测试只写setgrade或者只写getStudents().add,数据库记录都是正常的啊?只写一种不行吗?

stu1.setGrade(gra);

stu2.setGrade(gra);

gra.getStudents().add(stu1);

gra.getStudents().add(stu2);


正在回答

6 回答

没有配置级联:

GradeEntity grade = new GradeEntity("国家6","性别");
StudentEntity student1 = new StudentEntity("美国6","男");
StudentEntity student2 = new StudentEntity("法国6","女");
//配置多对1
student1.setGrade(grade);
student2.setGrade(grade);
//没有配置级联,所以3个都要保存
session.save(grade);
session.save(student1);
session.save(student2);

配置了级联

GradeEntity grade = new GradeEntity("国家6","性别");
StudentEntity student1 = new StudentEntity("美国6","男");
StudentEntity student2 = new StudentEntity("法国6","女");
//1对多
grade.getStudent().add(student1);
grade.getStudent().add(student2);
//多对1
student1.setGrade(grade);
student2.setGrade(grade);
//配置级联后主要写save(grade)就好了,但是1对多的关系必须写
session.save(grade);

看起来就这个区别

0 回复 有任何疑惑可以回复我~

刚才看了后面的内容,这么写是为了后面讲的级联,为了级联所以两个都要写

这里,如果grand和student都做save的话,只写一个就可以了,偷了关联的懒,少写一个关联

配置级联后,只要save一个就可以了,两者都是偷懒,级联偷了save的懒

0 回复 有任何疑惑可以回复我~

我也觉得是重复的,这两条语句都是为了包装插入数据库的时候都能有对应的值,如果一个就能实现,没必要写两条

0 回复 有任何疑惑可以回复我~

我也有相同的疑问,我测试过只要写setGrade就行了。再次查询的时候也是可以通过Grade查找到Students的。

0 回复 有任何疑惑可以回复我~

还可以级联操作。。往后看看就知道

0 回复 有任何疑惑可以回复我~

双向的一方放弃关系的维护和单向意义不相同!
单向只能保证你可以通过一个对象(A)导航到另一个对象(B)。
当你在实际的业务中需要通过另一个对象(B)导航到一个对象(A)的时候,你怎么办啊?
还有关于inverse="true",它的作用是在一对多双向关联关系中使一方放弃维护到对方的关系(抽象)。其实就是减少重复执行多余的SQL语句

简单的说就是很好的我可以通过Grade找到student,也可以通过student找到Grade

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Hibernate初探之一对多映射
  • 参与学习       42171    人
  • 解答问题       295    个

Hibernate中一对多关联映射配置,以及cascade和inverse属性作用

进入课程

为什么这两句话都要写。

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信