Hibernate 关联映射之多对多
Hibernate的关联映射包括:
一对一(Persion - IDCard)
一对多—epartment - Employee)
多对一(Employee - Department)
多对多(Teacher - Student)
组件映射(User - Name)
集合映射(Set、List、Map)
inverse和cascade(Employee - Department)
?
本文以多对多为例:
多个老师对应多个学生(Teacher- Student)
在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多。Hibernate会为我们创建中间关联表,转换成两个一对多。
<set? name="teacher"? table="teacher_student">
??? <key? column="teacher_id"/>
??? <many-to-many? lazy="true"><id name="id"><generator table="teacher_student"><key column="teacher_id"></key><many-to-many column="student_id"/></set></class></hibernate-mapping><!-- ///////////////////////////////////////////// --><?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.cos.entity.Student" lazy="true"><id name="id"><generator table="teacher_student"><key column="student_id"></key><many-to-many column="teacher_id"/></set></class></hibernate-mapping>
?
Hibernate配置文件:hibernate.cfg.xml
CREATE TABLE `teacher` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) default NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1CREATE TABLE `student` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) default NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1CREATE TABLE `teacher_student` ( `teacher_id` int(11) NOT NULL, `student_id` int(11) NOT NULL, PRIMARY KEY (`student_id`,`teacher_id`), KEY `FK2E2EF2DEE60D3423` (`teacher_id`), KEY `FK2E2EF2DED571E983` (`student_id`), CONSTRAINT `FK2E2EF2DED571E983` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`), CONSTRAINT `FK2E2EF2DEE60D3423` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1
?
?
?
?