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 }
Student.java
 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 }
Teacher.java

在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>
teacher.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.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>
student.hbm.xml

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 }
MainFunc.java

最后,数据库中增加了t_teacher,t_student和中间表t_tea_stu

数据库内的数据为:

完成了Hibernate的多对多的级联映射。

原文地址:https://www.cnblogs.com/miantiaoandrew/p/6934311.html