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>
原文地址:https://www.cnblogs.com/sean-zeng/p/11024793.html