Hibernate的多对多实例
在完成了一对多的实例的基础上,继续做多对多实例。例子是老师和学生,一个老师教多个学生,一个学生也有多个老师。
文档结构如图:
Student.java和Teacher.java的代码为:
1 package cn.hibernate.manytomany; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 public class Student { 7 private int stuId; 8 private String stuName; 9 private Set<Teacher> teachers = new HashSet<Teacher>(); 10 11 public Student(){ 12 13 } 14 15 public Student(int stuId, String stuName, Set<Teacher> teachers) { 16 this.stuId = stuId; 17 this.stuName = stuName; 18 this.teachers = teachers; 19 } 20 public int getStuId() { 21 return stuId; 22 } 23 public void setStuId(int stuId) { 24 this.stuId = stuId; 25 } 26 public String getStuName() { 27 return stuName; 28 } 29 public void setStuName(String stuName) { 30 this.stuName = stuName; 31 } 32 public Set<Teacher> getTeachers() { 33 return teachers; 34 } 35 public void setTeachers(Set<Teacher> teachers) { 36 this.teachers = teachers; 37 } 38 }
1 package cn.hibernate.manytomany; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 public class Teacher { 7 private int teaId; 8 private String teaName; 9 private Set<Student> stus = new HashSet<Student>(); 10 public int getTeaId() { 11 return teaId; 12 } 13 public void setTeaId(int teaId) { 14 this.teaId = teaId; 15 } 16 public String getTeaName() { 17 return teaName; 18 } 19 public void setTeaName(String teaName) { 20 this.teaName = teaName; 21 } 22 public Set<Student> getStus() { 23 return stus; 24 } 25 public void setStus(Set<Student> stus) { 26 this.stus = stus; 27 } 28 public Teacher(int teaId, String teaName, Set<Student> stus) { 29 this.teaId = teaId; 30 this.teaName = teaName; 31 this.stus = stus; 32 } 33 34 public Teacher(){ 35 36 } 37 }
在hibernate.cfg.xml最后添加映射关系:
<mapping resource="cn/hibernate/manytomany/teacher.hbm.xml"/>
<mapping resource="cn/hibernate/manytomany/student.hbm.xml"/>
teacher.hbm.xml和student.hbm.xml的代码为:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 6 <hibernate-mapping> 7 <class name="cn.hibernate.manytomany.Teacher" table="t_teacher"> 8 <id name="teaId" column="teaId"> 9 <generator class="native"></generator> 10 </id> 11 12 <property name="teaName" column="teaName" /> 13 14 <!-- student不放弃外键的维护 --> 15 <set name="stus" table="t_tea_stu" cascade="all" inverse="false"> 16 <key column="teaId"></key> 17 <many-to-many class="cn.hibernate.manytomany.Student" column="stuId"></many-to-many> 18 </set> 19 </class> 20 </hibernate-mapping>
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 6 <hibernate-mapping> 7 <class name="cn.hibernate.manytomany.Student" table="t_student"> 8 <id name="stuId" column="stuId"> 9 <generator class="native"></generator> 10 </id> 11 12 <property name="stuName" column="stuName"></property> 13 14 <!-- teacher放弃外键的维护 --> 15 <set name="teachers" table="t_tea_stu" cascade="all" inverse="true"> 16 <key column="stuId"></key> 17 <many-to-many class="cn.hibernate.manytomany.Teacher" column="teaId"></many-to-many> 18 </set> 19 </class> 20 </hibernate-mapping>
MainFunc.java的代码为:
1 package cn.hibernate.manytomany; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.Transaction; 6 import org.hibernate.cfg.Configuration; 7 8 public class MainFunc { 9 10 public static void main(String[] args) { 11 // TODO Auto-generated method stub 12 Configuration cfg = new Configuration().configure(); 13 SessionFactory sessionFactory = cfg.buildSessionFactory(); 14 Session session = sessionFactory.openSession(); 15 Transaction tx = null; 16 try{ 17 tx = session.beginTransaction(); 18 19 Teacher tea1 = new Teacher(); 20 tea1.setTeaName("Zhangsan"); 21 Teacher tea2 = new Teacher(); 22 tea2.setTeaName("Lisi"); 23 24 Student stu1 = new Student(); 25 stu1.setStuName("Sheldon"); 26 Student stu2 = new Student(); 27 stu2.setStuName("Leonard"); 28 Student stu3 = new Student(); 29 stu3.setStuName("Howard"); 30 Student stu4 = new Student(); 31 stu4.setStuName("Raj"); 32 33 //把student和teacher关联 34 stu1.getTeachers().add(tea1); 35 stu1.getTeachers().add(tea2); 36 stu2.getTeachers().add(tea1); 37 stu2.getTeachers().add(tea2); 38 stu3.getTeachers().add(tea1); 39 stu4.getTeachers().add(tea2); 40 41 //把teacher和student关联 42 tea1.getStus().add(stu1); 43 tea1.getStus().add(stu2); 44 tea1.getStus().add(stu3); 45 tea2.getStus().add(stu1); 46 tea2.getStus().add(stu2); 47 tea2.getStus().add(stu4); 48 49 //由于teacher放弃了外键的维护,所以没有session.save(tea1/tea2) 50 session.save(stu1); 51 session.save(stu2); 52 session.save(stu3); 53 session.save(stu4); 54 55 System.out.println("Add success"); 56 tx.commit(); 57 }catch(Exception e){ 58 e.printStackTrace(); 59 tx.rollback(); 60 }finally{ 61 session.close(); 62 sessionFactory.close(); 63 } 64 } 65 66 }
最后,数据库中增加了t_teacher,t_student和中间表t_tea_stu
数据库内的数据为:
完成了Hibernate的多对多的级联映射。