zoukankan      html  css  js  c++  java
  • 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的多对多的级联映射。

  • 相关阅读:
    python Json报错json.decoder.JSONDecodeError
    jupyter notebook改变行间图片大小
    SVM算法核函数的选择
    Linux中长时间运行程序的方法
    python通过多线程并获取返回值
    python多进程multiprocessing Pool相关问题
    pandas.read_sql_query()读取数据库数据用chunksize的坑
    Docker学习——Dockerfile
    Android之自定义ListView(一)
    Java编程思想——初始化与清理
  • 原文地址:https://www.cnblogs.com/miantiaoandrew/p/6934311.html
Copyright © 2011-2022 走看看