技术分析之Hibernate的关联关系映射之多对多映射

来源:互联网 发布:java 神经网络框架 编辑:程序博客网 时间:2024/06/05 08:27

多对多的表映射关系可以相当于是老师和学生,一个老师可以有多个学生,一个学生也可以有多个老师,下面是学生老师表的配置和代码

Student类

package pojo;import java.util.HashSet;import java.util.Set;public class Student {//sid   sname    sgender  private Long sid;private String sname;private String sgender;//集合Teacherprivate Set<Teacher>teachers=new HashSet<>();public Long getSid() {return sid;}public void setSid(Long sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public String getSgender() {return sgender;}public void setSgender(String sgender) {this.sgender = sgender;}public Set<Teacher> getTeachers() {return teachers;}public void setTeachers(Set<Teacher> teachers) {this.teachers = teachers;}@Overridepublic String toString() {return "Student [sid=" + sid + ", sname=" + sname + ", sgender=" + sgender + "]";}public Student(Long sid, String sname, String sgender, Set<Teacher> teachers) {super();this.sid = sid;this.sname = sname;this.sgender = sgender;this.teachers = teachers;}public Student() {super();// TODO Auto-generated constructor stub}}

Teacher类

package pojo;import java.util.HashSet;import java.util.Set;public class Teacher {//tid  tanme  tsexprivate Long tid;private String tname;private String tsex;//集合Studentprivate Set<Student> students=new HashSet<>();@Overridepublic String toString() {return "Teacher [tid=" + tid + ", tname=" + tname + ", tsex=" + tsex + ", students=" + students + "]";}public Long getTid() {return tid;}public void setTid(Long tid) {this.tid = tid;}public String getTname() {return tname;}public void setTname(String tname) {this.tname = tname;}public String getTsex() {return tsex;}public void setTsex(String tsex) {this.tsex = tsex;}public Set<Student> getStudents() {return students;}public void setStudents(Set<Student> students) {this.students = students;}public Teacher(Long tid, String tname, String tsex, Set<Student> students) {super();this.tid = tid;this.tname = tname;this.tsex = tsex;this.students = students;}public Teacher() {super();// TODO Auto-generated constructor stub}}

Student.hbm.xml的配置

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">            <hibernate-mapping>    <class name="pojo.Student" table="student">        <id name="sid">    <generator class="native"/>    </id>    <property name="sname"/>    <property name="sgender"/>            <!--set  name当前对象的集合的属性   table:中间表的名字-->    <set name="teachers"  table="stu_teacher" inverse="false"   cascade="save-update,delete">    <!-- 表示当前对象 在中间中的外键 -->    <key column="sid"/>    <!-- 当前对象中的集合的类型Teacher   Teacher的全限定名-->    <many-to-many column="tid" class="pojo.Teacher" />    </set>            </class>        </hibernate-mapping>

Teacher.hbm.xml的配置

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">            <hibernate-mapping>    <class name="pojo.Teacher" table="teacher">        <id name="tid">    <generator class="native"/>    </id>    <property name="tname"/>    <property name="tsex"/>            <!--set  name当前对象的集合的属性   table:中间表的名字-->
<set name="students"  table="stu_teacher" inverse="true" cascade="save-update,delete">
    <!-- 表示当前对象 在中间中的外键 -->    <key column="tid"/>    <!-- 当前对象中的集合的类型Student在中间中的外键 和全限定名   Teacher的全限定名-->    <many-to-many column="sid" class="pojo.Student" />    </set>            </class>        </hibernate-mapping>
hibernate.cfg.xml只需要引入student和teacher的映射配置文件就好

 test类
//模拟一对多来实现保存学生和老师/** * 多对多  保存数据  默认是双方都要维护外键      多对多必须要有一方来放弃对外键的维护 inverser="true" * 多对多任意一方放弃对外键的维护 都可以 * 一般情况下:让哪一方来维护外键呢???  如果我们频繁操作学生,让学生来维护外键,老师就得放弃对外键的维护。 * 现在我存储学生来级联保存老师,学生维护外键,回去中间表里面插入数据; * 这个时候保存老师来级联保存学生,这个时候,老师放弃对外键维护了,不会往中间表里面插入数据。 */@Testpublic void run1(){Session session = HibernateUtil.getCurrentSession();Transaction ts = session.beginTransaction();//Student s1=new Student();Student s2=new Student();Teacher t1=new Teacher();Teacher t2=new Teacher();s1.setSname("同学1");s2.setSname("同学2");t1.setTname("老师1");t2.setTname("老师2");//建立关系      同学1对应2个老师s1.getTeachers().add(t1);s1.getTeachers().add(t2);s2.getTeachers().add(t1);//同学2对应一个老师t1.getStudents().add(s1);t1.getStudents().add(s2);t2.getStudents().add(s1);session.save(t1);session.save(t2);session.save(s1);session.save(s2);ts.commit();}




原创粉丝点击