Hibernate多对多双向关联
来源:互联网 发布:淘宝典典妈代购靠谱吗 编辑:程序博客网 时间:2024/05/21 05:40
以Student和Course为例,一个学生可以选多门课程,一门课程也可以被多个学生选取;
持久化类Student:
持久化类Course:对象关系映射文件Student.hbm.xml:多对多关联关系的实现需要一个连接表,<set>的属性指出的就是连接表的名称,<key>指出连接表参照students表id的外键的字段名;<many-to-many>中的class指定与Student多对多关联的类,column指定连接表参照Course映射表(此处由Course.hbm.xml映射为courses表)id的外键的字段名,Course.hbm.xml中的<set>配置与Student.hbm.xml中<set>相反:
Course.hbm.xml:
注意:两个映射文件中设置的连接表的名称以及连接表中的两个字段名需对应相同,如连接表名都为"students_courses"两字段为"student_id"和"course_id",否则会导致不必要的麻烦;连接表的主键为联合主键(student_id,course_id)。
三个表的结构及对应关系如下所示:
保存对象:
(1)如果两个映射文件的inverse都设为false(默认),则会出现异常(主键重复)导致插入失败:
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
Caused by: Java.sql.BatchUpdateException: Duplicate entry '1-1' for key 'PRIMARY'
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:Duplicate entry '1-1' for key 'PRIMARY'解释:应为两映射文件中的inverse都为true,则Student和Course都去维护关联关系,即同时向连接表中插入记录,则会导致主键重复而插入失败。
解决办法:
——将其中一方的inverse设为true,让对方维持关联关系;
——将s1.getCourses().add(c1);或 c1.getStudents().add(s1);删除,因为若某个Course中的students集合为空时,它就不会去向连接表中添加记录,也就不会与Student向连接表中插入记录时冲突而主键重复。
(2)如果都设为true,则都不会向连接表中插入记录而只是向两表中插入记录(两者都认为对方会维持关联关系)执行的SQl语句为:
(3)设一方的inverse为true,正常插入数据时输出的SQL语句为:删除学生(Student)记录:注意:(1)如果不是Student维持关联关系:
——若连接表students_courses中有参照students表中该记录的记录(即在students_courses表中存在student_id为2L的记录)时,则删除失败。
——若连接表students_courses中没有参照students表中该记录的记录时,则可以成功地将该记录删除。
(2)如果是Student维持关联关系:
——先将连接表students_courses中参照students表中该记录的记录删除,然后将该学生记录从students表中删除
查询某学生选的所有课程:
某学生又选了一门新课(增加了连接表中的一条记录):
删除某学生的一条选课记录(删除了连接表中的一条记录):
转载请注明出处:http://blog.csdn.NET/jialinqiang/article/details/8698052
- Hibernate多对多双向关联映射
- Hibernate 多对多双向关联
- hibernate 多对多 双向关联实战
- Hibernate 多对多双向关联
- Hibernate 多对多双向关联
- Hibernate 多对多双向关联
- hibernate多对多双向关联_Annotation
- hibernate多对多双向关联_XML
- Hibernate多对多双向关联
- Hibernate 多对多双向关联
- Hibernate多对多双向关联
- hibernate 多对多双向关联
- hibernate多对多双向关联
- hibernate多对多双向关联
- Hibernate多对多双向关联
- Hibernate 多对多双向关联
- hibernate双向多对多关联
- Hibernate多对多双向关联
- 分布式缓存和代理
- 在activity里面监听返回键的方法
- 修养和抱负
- JVM调优总结(7):调优方法
- linux操作系统安装wps不能输入中文
- Hibernate多对多双向关联
- 蓝桥杯基础训练——Fibonacci数列
- git push 不带任何参数的
- HttpClient实现的https工具类
- Android自定义控件之自定义View(二)
- SVM-SVR
- webpack配置文件解析
- 邮件发送 Email
- HTML5实现动画三种方式