📜  Hibernate – 一对多映射(1)

📅  最后修改于: 2023-12-03 15:31:07.876000             🧑  作者: Mango

Hibernate - 一对多映射

在hibernate中,一对多关系映射是指一个实体类与另一个实体类之间存在一一对多的关系,比如一个班级对应多个学生,或者一个部门对应多个员工。

准备工作

在进行一对多映射时,需要先准备好两个实体类,例如班级和学生的实体类。以班级和学生为例,假设班级类是Class,学生类是Student,班级类和学生类之间是一对多关系,即一个班级对应多个学生,可以在Class类中定义一个List类型的属性students来保存该班级的所有学生:

public class Class {
    private int id; //班级id
    private String name; //班级名称
    private List<Student> students; //该班级的所有学生
    
    //getter和setter方法
}

在Student类中可以定义一个Class类型的属性class来保存该学生所在的班级:

public class Student {
    private int id; //学生id
    private String name; //学生姓名
    private Class class; //该学生所在的班级
    
    //getter和setter方法
}

在映射关系中,需要在Class.hbm.xml中定义与Student类之间的一对多关系,同时在Student.hbm.xml中定义与Class类之间的多对一关系。在Class.hbm.xml中,可以通过<set>标签来定义与Student类之间的一对多关系:

<hibernate-mapping>
    <class name="com.example.Class" table="class">
        <id name="id" column="class_id">
            <generator class="native"/>
        </id>
        <property name="name" column="class_name"/>
        <set name="students" table="student" inverse="true" cascade="all">
            <key column="class_id"/>
            <one-to-many class="com.example.Student"/>
        </set>
    </class>
</hibernate-mapping>

在Student.hbm.xml中,可以通过<many-to-one>标签来定义与Class类之间的多对一关系:

<hibernate-mapping>
    <class name="com.example.Student" table="student">
        <id name="id" column="student_id">
            <generator class="native"/>
        </id>
        <property name="name" column="student_name"/>
        <many-to-one name="class" class="com.example.Class" column="class_id"/>
    </class>
</hibernate-mapping>
操作实体类

在操作实体类时,可以通过添加和删除学生来测试一对多关系是否已经成功映射。以添加学生为例,可以先通过session保存班级对象,然后在班级对象中添加学生,最后再保存学生对象。

Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();

Class myClass = new Class();
myClass.setName("一年级一班");

Student student1 = new Student();
student1.setName("小明");
myClass.getStudents().add(student1);

Student student2 = new Student();
student2.setName("小红");
myClass.getStudents().add(student2);

session.save(myClass);

tx.commit();
session.close();

以上代码创建了一个班级对象myClass和两个学生对象student1和student2,并将学生对象添加到班级对象中,最后保存班级对象。

总结

本文介绍了hibernate中一对多关系的映射方法,并给出了代码示例。在实际应用中,需要根据实际需求设计实体类和映射关系,以满足数据的存储和查询需求。