在Hibernate中的多对多关联关系,一般是不会使用的,因为对于数据库查询的时候时间复杂度太高。
我们在这里做的是学生和老师,一个学生可以有多个老师,一个老师可以有多个学生。
我们首先建立一个学生实体类:Student.java
package cn.itcast.hibernate.domain; import java.util.Set; public class Student { private int id; private String name; private Set<Teacher> teachers; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Teacher> getTeachers() { return teachers; } public void setTeachers(Set<Teacher> teachers) { this.teachers = teachers; } }
我们定义了三个三个属性,分别是id、name和一个set集合
然后是老师实体类:Teacher.java
package cn.itcast.hibernate.domain; import java.util.Set; public class Teacher { private int id; private String name; private Set<Student> students; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Student> getStudents() { return students; } public void setStudents(Set<Student> students) { this.students = students; } }
我们仍然定义了三个实体类,id、name和一个set集合
然后,我们看下Stduent类的映射文件:
<?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 package="cn.itcast.hibernate.domain"> <class name="Student"> <id name="id"> <generator class="native"/> </id> <property name="name" /> <set name="teachers" table="teacher_student"> <key column="student_id" /> <many-to-many class="Teacher" column="teacher_id" /> </set> </class> </hibernate-mapping>
在这个文件中,我们定义了:id自动增长、name属性,还有一个<set>标签,name属性是Student.java中的set集合的那个属性,然后我们在<key>标签定义外键是student_id,然后又定义了一个<many-to-many>标签,规定了多对多的关系。
下边是Teacher.java类的映射文件:
<?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 package="cn.itcast.hibernate.domain"> <class name="Teacher"> <id name="id"> <generator class="native"/> </id> <property name="name" /> <set name="students" table="teacher_student"> <key column="teacher_id" /> <many-to-many class="Student" column="student_id"/> </set> </class> </hibernate-mapping>
和上边的Stduent类的映射文件差不多
然后,我们写一个测试类:Many2Many.java
package cn.itcast.hibernate; import java.util.HashSet; import java.util.Set; import org.hibernate.Session; import org.hibernate.Transaction; import cn.itcast.hibernate.domain.Student; import cn.itcast.hibernate.domain.Teacher; public class Many2Many { public static void main(String[] args) { add(); query(1); } static void add(){ Session s = null; Transaction tx = null; try{ //定义了一个Teahcer的set集合 Set<Teacher> ts = new HashSet<Teacher>(); //定义了一个Student的set集合 Set<Student> ss = new HashSet<Student>(); //增加一个老师1 Teacher t1 = new Teacher(); t1.setName("t1 name"); ts.add(t1); //增加一个老师2 Teacher t2 = new Teacher(); t2.setName("t2 name"); ts.add(t2); //增加一个学生1 Student s1 = new Student(); s1.setName("s1"); ss.add(s1); //增加一个学生2 Student s2 = new Student(); s2.setName("s2"); ss.add(s2); //这里是设置两个teacher的set属性 t1.setStudents(ss); t2.setStudents(ss); /* * 这是是设置两个student的set属性,如果和上边的设置同时出现,则会抛出异常,因为多对多的关系在上边已经建立 * s1.setTeachers(ts); s2.setTeachers(ts); */ s = HibernateUtil.getSession(); tx = s.beginTransaction(); s.save(t1); s.save(t2); s.save(s1); s.save(s2); tx.commit(); }finally{ if(s!=null){ s.close(); } } } static void query(int id){ Session s = null; Transaction tx = null; try{ s = HibernateUtil.getSession(); tx = s.beginTransaction(); //根据id查询得到Teacher对象 Teacher t = (Teacher) s.get(Teacher.class, id); //把Teacher对象对应的学生的数量打出来 System.out.println("Students:"+t.getStudents().size()); tx.commit(); }finally{ if(s!=null){ s.close(); } } } }
时间: 2024-10-11 19:14:03