首先说明:
多对多的关系在Hibernate中使用一个临时表来维护表与表之间的关系
下面用一个经典的学生和课程之间的关系来说明:
Student类:
package ray.many2many;
import java.util.HashSet;
import java.util.Set;
public class Student2 {
private int s_id;
private String s_name;
//增加set维护多对多关系
private Set<Course> courses = new HashSet<Course>();
public Set<Course> getCourses() {
return courses;
}
//增加一个方法,方便添加course
public void addCourse(Course c){
this.courses.add(c);
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
}
再看Course类
package ray.many2many;
import java.util.HashSet;
import java.util.Set;
public class Course {
private int c_id;
private String c_name;
private Set<Student2> students = new HashSet<Student2>();
public void addStudent(Student2 s) {
this.getStudents().add(s);
}
public Set<Student2> getStudents() {
return students;
}
public void setStudents(Set<Student2> students) {
this.students = students;
}
}
Student2.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="ray.many2many">
<class name="Student2" table="_student2" lazy="true">
<id name="s_id">
<generator class="native"></generator>
</id>
<property name="s_name" type="string" />
<set name="courses" table="stu_course">
<!-- key定义集合表到其拥有表的外键 -->
<key column="s_id" />
<!-- many-to-many 集合表到该元素的外键 -->
<many-to-many class="Course" column="c_id" />
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="ray.many2many">
<class name="Course" table="_course" lazy="true">
<id name="c_id">
<generator class="native"></generator>
</id>
<property name="c_name" type="string"></property>
<set name="students" table="stu_course">
<!-- key定义集合表到其拥有表的外键
property-ref用于指定非主键的列作为参考外键
这里默认是用Course的主键作为stu_course的外键 -->
<key column="c_id" />
<!-- many-to-many 集合表到该元素的外键 -->
<!-- column(必需): 这个元素的外键关键字段名
property-ref: 用于指定关联类(Student2)连接到外键的属性,即那个字段与集合表stu_course中的
s_id关联,如果没指定就默认为关联类(Student2)的主键 -->
<many-to-many class="Student2" column="s_id" />
</set>
</class>
</hibernate-mapping>
package ray.many2many;
import org.hibernate.Session;
import ray.SessionUtil.HibernateSessionFactory;
public class Test {
public static void main(String[] args) {
Student2 s1 = new Student2();
s1.setS_name("s1");
Student2 s2 = new Student2();
s2.setS_name("s2");
Course c1 = new Course();
c1.setC_name("c1");
Course c2 = new Course();
c2.setC_name("c2");
s1.addCourse(c1);
s1.addCourse(c2);
s2.addCourse(c1);
s2.addCourse(c2);
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
session.save(s1);
session.save(s2);
session.save(c1);
session.save(c2);
session.getTransaction().commit();
session.close();
}
}
Hibernate:
alter table stu_course
add index FK_ou4tqx7p2o5vcr9kqkben0sq1 (c_id),
add constraint FK_ou4tqx7p2o5vcr9kqkben0sq1
foreign key (c_id)
references _course (c_id)
Hibernate:
alter table stu_course
add index FK_hlej7dqm89pyna77is8b78d93 (s_id),
add constraint FK_hlej7dqm89pyna77is8b78d93
foreign key (s_id)
references _student2 (s_id)