传智播客Hibernate视频教程学习笔记21

来源:互联网 发布:nginx 隐藏版本号 编辑:程序博客网 时间:2024/06/04 18:12

 

 多对多关系的关联映射:

学生教师关系为例

Student.java

Teacher.java

Student.hbm.xml

Teacher.hbm.xml

 

<set name="students" table="teacher_student">

   <key column="teacher_id"></key>
   <many-to-many class="Student" column="student_id"></many-to-many>
 </set>  
表示Teacher类中的students成员变量以Teacher类的id成员变量=teacher_student表中的teacher_id为条件,查找teacher_student表中所有符合条件的student_id,在通过student_id在Student表中查找具体信息,完成关联。

 

 

test.java

一开始不设置关联,测试插入,成功。

Hibernate: insert into Student (name) values (?)
Hibernate: insert into Student (name) values (?)
Hibernate: insert into Teacher (name) values (?)
Hibernate: insert into Teacher (name) values (?)

四条插入语句。

teacher_student关联表也自动生成。关联表中teacher_id student_id均为主键 外键。

也说明Hibernate只要在满足数据库单表中符合约束的值均可正常插入,此处关联信息在生成表中,所以单表中不像一对多关系有外键约束。

 

 

加入以上代码以后运行,正确生成关联,

Hibernate: insert into Student (name) values (?)
Hibernate: insert into Student (name) values (?)
Hibernate: insert into Teacher (name) values (?)
Hibernate: insert into teacher_student (teacher_id, student_id) values (?, ?)
Hibernate: insert into teacher_student (teacher_id, student_id) values (?, ?)
Hibernate: insert into Teacher (name) values (?)

 

 

但是如果同时给学生也设置老师集合,则报主键冲突错误

Exception in thread "main" org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: domain.Teacher

其实学了关系映射以后,有一点一直不是很明白,Hibernate到底是怎么处理这种双向关系的,以前用jdbc模仿的时候也不会处理,只有一方为主来控制的,好像Hibernate也分主方从方,不明白。。。继续学习。。。

原创粉丝点击