Hibernate(7)关系映射和Cascade级联操作

本文详细介绍了ORM中常见的关联关系映射方式,包括多对一、一对多、一对一及多对多的关系,并提供了具体的Java代码示例和配置文件示例。此外还探讨了cascade级联操作的应用场景。

1 关联关系映射

  • 多对一(Employee-Department)
  • 一对多(Department-Employee)
  • 一对一(Person-IdCard)
  • 多对多(teacher-student)
  • cascade(Employee-Department)

2 多对一(Employee-Department)

**domain文件:**Studcourse.java

public class Studcourse {
    private BigDecimal stucourseid;
    private Student student;
    private Course course;
    private BigDecimal grade;
}

**配置文件:**Studcourse.hbm.xml

<many-to-one name="student" class="com.test.domain.Student" fetch="select">
    <column name="SID" precision="22" scale="0" />
</many-to-one>

3 一对多(Department-Employee)

**domain文件:**Student.java

public class Student implements java.io.Serializable {
    private BigDecimal sid;
    private String sname;
    private Set studcourses = new HashSet(0);
}

**配置文件:**Student.hbm.xml

<set name="studcourses" inverse="true">
    <key>
        <column name="SID" precision="22" scale="0" />
    </key>
    <one-to-many class="com.test.domain.Studcourse" />
</set>

4 一对一(Person-IdCard)

有两种方式:基于主键的一对一;基于外键的一对一。

①基于主键的一对一

这里写图片描述
**domain文件:**Person.java和IdCard.java

class Person{
    private Integer id;
    private String name;
    private IdCard idCard;
}
class IdCard {
    private Integer id;
    private Date validateDte;
    private Person person;
}

配置文件:
Person.hbm.xml

<one-to-one name="idCard" class="com.test.domain.IdCard"></one-to-one>

IdCard.hbm.xml

<id name="id" type="java.lang.Integer">
    <generator class="foreign">
        <param name="property">person</param>
    </generator>
</id>
<one-to-one name="person" class="com.test.domain.Person" constrained="true"></one-to-one>

②基于外键的一对一

这里写图片描述
**domain文件:**Person.java和IdCard.java

class Person{
    private Integer id;
    private String name;
    private IdCard idCard;
}
class IdCard {
    private Integer id;
    private Date validateDte;
    private Person person;
}

配置文件:
Person.hbm.xml

<one-to-one name="idCard" class="com.test.domain.IdCard"></one-to-one>

IdCard.hbm.xml

<id name="id" type="java.lang.Integer">
    <generator class="assigned" />
</id>
// one-to-one实际上是many-to-one的一个特例
<many-to-one name="person" unique="true" />

5 多对多(teacher-student)

在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;Hibernate会为我们创建中间关联表,转换成两个一对多。
domain文件:

public class Student implements java.io.Serializable {
    private BigDecimal sid;
    private String sname;
    private Set studcourses = new HashSet(0);
}
public class Course implements java.io.Serializable {
    private BigDecimal cid;
    private String cname;
    private Short ccredit;
    private Set studcourses = new HashSet(0);
}
public class Studcourse {
    private BigDecimal stucourseid;
    private Student student;
    private Course course;
    private BigDecimal grade;
}

配置文件:
Student.hbm.xml 和 Course.hbm.xml

<set name="studcourses" inverse="true">
    <key>
        <column name="S_ID" precision="22" scale="0" />
    </key>
    <one-to-many class="com.test.domain.Studcourse" />
</set>

Studcourse.hbm.xml

<many-to-one name="student" class="com.test.domain.Student" fetch="select">
    <column name="S_ID" precision="22" scale="0" />
</many-to-one>
<many-to-one name="course" class="com.test.domain.Course" fetch="select">
    <column name="C_ID" precision="22" scale="0" />
</many-to-one>

6 cascade(Employee-Department)

  • Cascade用来说明当对主对象进行某种操作(添加、修改、删除……)时(比如删除一个部门时,删除该部门所有员工),是否对其关联的从对象也作类似的操作。
  • 常用的cascade
    none, all, save-update, delete, lock, refresh, evict, replicate, persist, merge, delete-orphan(one-to-many)
  • 一般在many-to-one,many-to-many中不设置级联,在one-to-one, one-to-many中设置级联。
  • 在集合属性和普通属性中都能使用cascade
  • 一般讲,cascade配置在one-to-one(主对象一方), one-to-many(one的一方)
<set name="studcourses" inverse="true" cascade="all">
    <key>
        <column name="SID" precision="22" scale="0" />
    </key>
    <one-to-many class="com.test.domain.Studcourse" />
</set>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ADreamClusive

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值