恋の歌的logo
Auto
归档 标签

Hibernate中的多对一、一对多映射

发表于2020-06-11 23:21
更新于2023-02-13 18:28
总字数567
阅读时长 ≈2 分钟

前言 🔗

之前写的一对一 这次写写多对一、一对多

准备 🔗

一个Hibernate环境的Java项目 这个之前的帖子有 就不再写了

一对多(多对一) 🔗

这里用老师和学生来做例子 一个老师有多个学生 一个学生只能属于一个老师

Teacher类

java
public class Teacher {
    private int id;
    private String name;
    // 注意:这里的set要自己初始化,不然会报空指针的异常
    private Set<Student> list = new HashSet<>();
    // ...省略getter、setter和toString方法
}

Teacher类对应的Teacher.hbm.xml

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">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name"></property>
        <!-- set表示一个无需不重复的集合 -->
        <!-- name表示类中集合的属性名 -->
        <set name="list">
            <!-- 
                key表示多的一方的外键,column指定列名
                也就是会在student表指定一个列,列名为teacher_id来指向老师
             -->
            <key column="teacher_id"></key>
            <!-- 指定集合的类型 -->
            <one-to-many class="pojo.Student"></one-to-many>
        </set>
    </class>
</hibernate-mapping>

Student类

java
public class Student {
    private int id;
    private String name;
    private Teacher teacher;
    // ...省略getter、setter和toString方法
}

Student类对应的Student.hbm.xml

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">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name"></property>
        <!-- 学生这一方是多的一方,指向老师一的一方 -->
        <!-- name表示类中对应一的一方的属性名,column表示学生这一方指向老师的外键列名 -->
        <many-to-one name="teacher" column="teacher_id"></many-to-one>
    </class>
</hibernate-mapping>

写个测试类测试下

java
public class HibernateTest {

    @Test
    public void test01() {
        Session session = SessionUtil.getSession();
        Transaction transaction = session.beginTransaction();
        
        // new一个老师
        Teacher teacher = new Teacher();
        teacher.setName("teacher");
        // new两个学生
        Student student1 = new Student();
        student1.setName("student1");
        Student student2 = new Student();
        student2.setName("student2");
        // 老师一方设置关联关系
        teacher.getList().add(student1);
        teacher.getList().add(student2);
        // 学生一方设置关联关系
        student1.setTeacher(teacher);
        student2.setTeacher(teacher);
        // 保存
        session.save(teacher);
        session.save(student1);
        session.save(student2);

        transaction.commit();
        session.close();
        SessionUtil.close();
    }
}

运行之后 就可以看到

Teacher表

Student表

Student表中的外键

后记 🔗

多对一还好 不是特别的难理解

#Java
哦呐该,如果没有评论的话,瓦达西...