• Hibernate的多对多映射关系


    example:
        老师(teacher)和学生(Student)就是一个多对多的关系吧?老师可以有多个学生,学生也可以由多个老师,那在Hibernate中多对多是怎样实现的呢??

    在Hibernate中多对多关系分为两种:1单向的多对多,2双向的多对多

    下面详细说明一些两种有什么不同和实现步骤

      I单向的多对多实现步骤:

      1新建teacher、student表,可以任意选择在其中一个表添加另一个表的集合,(例如在teacher中添加student的set<Student>集合,例如private set<student> students)

      代码如下:

      teacher:

    package com.atguigu.hibernate.n2n;
    
    import java.util.Set;
    
    public class Teacher {
        private Integer ID;
        private String  Name;
        private Set<Student> students;
        public Integer getID() {
            return ID;
        }
        public void setID(Integer iD) {
            ID = iD;
        }
        public String getTea_Name() {
            return Name;
        }
        public void setTea_Name(String Name) {
            this.Name =Name;
        }
        public Set<Student> getStudents() {
            return students;
        }
        public void setStudents(Set<Student> students) {
            this.students = students;
        }
        
    }

    Student:
      

    package com.atguigu.hibernate.n2n;
    
    public class Student {
        private Integer S_ID;
        private String  s_Name;
        public Integer getS_ID() {
            return S_ID;
        }
        public void setS_ID(Integer s_ID) {
            S_ID = s_ID;
        }
        public String getS_Name() {
            return s_Name;
        }
        public void setS_Name(String s_Name) {
            this.s_Name = s_Name;
        }
        
    }

    2在有set集合属性的持久化类的.hbm.xml文件里添加集合信息和many-to-many信息,另外一个表的.hbm.xml文件跟平常一样即可

    teacher:

      

    <?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>
        <class name="com.atguigu.hibernate.n2n.Teacher" table="TEACHER">
          
            <id name="ID" type="java.lang.Integer">
                <column name="ID" />
                <generator class="native" />
            </id>
            
            <property name="Name" type="java.lang.String" access="field">
                <column name="NAME" />
            </property>
              <!-- 
                    name:set集合的名字
                    Table:中间表的名字
                    key--column:中间表的外键列的名字,这个类的值就是属于<class name="">这个类的ID值
                    many-to-many的column:也是指定中间表的外键列的名字,这列的值就属于many-to-many的class类的ID值
             -->
            <!---注释部分可能会引起XML格式错误,--->
            <set name="students" table="t_s_Connection">
                <key>
                    <column name="T_ID" />
                </key>
                <many-to-many class="com.atguigu.hibernate.n2n.Student"  column="S_ID"/>
            </set>
            
        </class>
    </hibernate-mapping>
        

    student:

      

    <?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>
        <class name="com.atguigu.hibernate.n2n.Student" table="STUDENT">
          
            <id name="S_ID" type="java.lang.Integer">
                <column name="S_ID" />
                <generator class="native" />
            </id>
           
            <property name="s_Name" type="java.lang.String">
                <column name="S_NAME" />
           </property>
           
        </class>
    </hibernate-mapping>

    然后配置一下Hibernate.cfg.xml文件即可

    单向的多对多关系,就是这样了,但是其的增删改查又有什么特点???这个稍后再探究

    II双向的多对多关系如何配置
    1在双方持久化类(就是teacher和student)中互相添加对方的对象集合,并且当中有一个需要实例化

    例如:在teacher中添加private set<student>

        在student中添加private set<teacher>=new hashSet<teacher>();

    代码:teacher:

    package com.atguigu.hibernate.n2n;
    
    import java.util.Set;
    
    public class Teacher {
        private Integer ID;
        private String  Name;
        private Set<Student> students;
        public Integer getID() {
            return ID;
        }
        public void setID(Integer iD) {
            ID = iD;
        }
        public String getTea_Name() {
            return Name;
        }
        public void setTea_Name(String Name) {
            this.Name =Name;
        }
        public Set<Student> getStudents() {
            return students;
        }
        public void setStudents(Set<Student> students) {
            this.students = students;
        }
        
    }

    student:

    package com.atguigu.hibernate.n2n;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Student {
        private Integer S_ID;
        private String  s_Name;
        private Set<Teacher> teachers=new HashSet<Teacher>();
        
        public Set<Teacher> getTeachers() {
            return teachers;
        }
        public void setTeachers(Set<Teacher> teachers) {
            this.teachers = teachers;
        }
        public Integer getS_ID() {
            return S_ID;
        }
        public void setS_ID(Integer s_ID) {
            S_ID = s_ID;
        }
        public String getS_Name() {
            return s_Name;
        }
        public void setS_Name(String s_Name) {
            this.s_Name = s_Name;
        }
        
    }

    2在双方的持久化类中添加set和many-to-many设置

    teacher.hbm.xml:

    <?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>
        <class name="com.atguigu.hibernate.n2n.Teacher" table="TEACHER">
          
            <id name="ID" type="java.lang.Integer">
                <column name="ID" />
                <generator class="native" />
            </id>
            
            <property name="Name" type="java.lang.String" access="field">
                <column name="NAME" />
            </property>
              <!-- 
                    name:set集合的名字
                    Table:中间表的名字
                    key--column:中间表的外键列的名字(可以放任意名字),就是指明中间表的外键列是当前持久化类的的ID属性
                 many-to-many的column:也是指定中间表的外键列的名字,这列的值就属于many-to-many的class类的ID值
             -->
            <set name="students" table="t_s_Connection">
                <key>
                    <column name="T_ID" />
                </key>
                <many-to-many class="com.atguigu.hibernate.n2n.Student"  column="S_ID"/>
            </set>
            
        </class>
    </hibernate-mapping>

    student.hbm.xml:

    <?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>
        <class name="com.atguigu.hibernate.n2n.Student" table="STUDENT">
          
            <id name="S_ID" type="java.lang.Integer">
                <column name="S_ID" />
                <generator class="native" />
            </id>
           
            <property name="s_Name" type="java.lang.String">
                <column name="S_NAME" />
           </property>
           <set name="teachers" table="t_s_Connection">
                   <key>
                       <column name="S_ID"></column>
                       
                   </key>
                   <many-to-many class="com.atguigu.hibernate.n2n.Teacher" column="T_ID"></many-to-many>
           </set>
        </class>
    </hibernate-mapping>

    然后在Hibernate.cfg.xml文件配置一下mapping-resource即可

    但是双向的多对多关系的增删改查又是怎样的呢??

    而且单向的多对多关系和多向的多对多关系两者有什么不同,有什么有缺点??

  • 相关阅读:
    VS 2008 和 .NET 3.5 Beta 2 发布了
    搭建.NET 3.0环境
    Expression Studio和Silverlight学习资源、安装问题汇总
    Discuz! NT官方社区
    VS2005中ajax安装指南[转]
    IT人 不要一辈子靠技术生存(转)
    Discuz!NT2.5发布 正式版同步开源
    VS2005下开发Silverlight 1.1翻译加补充
    自动化测试案例
    [原]JavaScript必备知识系列开篇
  • 原文地址:https://www.cnblogs.com/jeremy-blog/p/4013203.html
Copyright © 2020-2023  润新知