• Hibernate的关联映射--一对多、


    这是我
    1 单向一对多:
    实体类:(课程类)Grade与(学生类)Student的一对多关系
    学生类:

    public class Student implements java.io.Serializable {
        // Fields
        private Long id;
        private String name;
        private Integer age;
        private Long gradeId;
        //省略set、get方法
    }

    bhm.xml:

    <hibernate-mapping>
        <class name="com.zx.model.Student" table="student" catalog="hibernate">
            <id name="id" type="java.lang.Long">
                <column name="id" />
                <generator class="native" />
            </id>
            <property name="name" type="java.lang.String">
                <column name="name" length="50" />
            </property>
            <property name="age" type="java.lang.Integer">
                <column name="age" />
            </property>
            <property name="gradeId" type="java.lang.Long">
                <column name="grade_id" />
            </property>
        </class>
    </hibernate-mapping>

    课程类:

    public class Grade implements java.io.Serializable {
        // Fields
        private Long id;
        private String name;
    }

    xml

    <hibernate-mapping>
        <class name="com.zx.model.Grade" table="grade" catalog="hibernate">
            <id name="id" type="java.lang.Long">
                <column name="id" />
                <generator class="native" />
            </id>
            <property name="name" type="java.lang.String">
                <column name="name" length="50" />
            </property>
    
            <!-- 配置与student一对多的关系-->
            <set name="students" inverse="true" cascade="delete">  
                <key column="grade_id" />  
                <one-to-many class="com.zx.model.Student"/>  
            </set>  
        </class>
    </hibernate-mapping>

    测试findById():

        public static void main(String[] args) {
            GradeDAO gradeDAO = new GradeDAO();
            Grade grade = new Grade();
            grade.setId(1L);
            Grade grade2 = gradeDAO.findById(1L);   
            for (Student stu : grade2.getStudents()) {
                log.debug(stu.getName());
            }
        }

    关联查询不管inverse、cascade为何值时,都会查询到课程对应得学生集合。插入时只插入一张表,不会级联。

    2 双向关联映射
    在两个关联实体中,同时配置了两种关联关系,这是这两个实体间就形成了双向关联映射,查询数据时互不影响,但是插入、更新、删除数据就会产生级联更新的问题。一班来说关系的维护交给多的一方维护,那么就需要在“一”的一方的配置文件中,加入invers=”true”的设置。
    Student:

       <hibernate-mapping>
        <class name="com.zx.model.Student" table="student" catalog="hibernate">
            ....
            <!-- 
            <property name="gradeId" type="java.lang.Long">
                <column name="grade_id" />
            </property> -->
    
            <!-- 配置双向关联 -->
            <many-to-one name="grade">
                <column name="grade_id"></column>
            </many-to-one>
        </class>
    </hibernate-mapping>

    Grade:

    <hibernate-mapping>
        <class name="com.zx.model.Grade" table="grade" catalog="hibernate">
            ...
    
            <!-- 配置与student一对多的关系, **维护关系交给多的一方维护** -->
            <set name="students" inverse="true" cascade="all">  
                <key column="grade_id" />  
                <one-to-many class="com.zx.model.Student"/>  
            </set>  
        </class>
    </hibernate-mapping>
  • 相关阅读:
    this用法
    break/continue的使用
    解决:sql server无法在C盘下创建database/操作系统错误5(拒绝访问)
    (转)科普:SATA、PCIe、AHCI、NVMe
    Java按位取反运算符“~”的工作原理
    <剑指offer> 第12题
    <剑指offer> 第11题
    <剑指offer> 第10题
    <剑指offer> 第9题
    <剑指offer> 第8题
  • 原文地址:https://www.cnblogs.com/sean-zeng/p/11024793.html
Copyright © 2020-2023  润新知