孙卫琴的《精通JPA与Hibernate》的读书笔记:映射继承关系之一(根类对应一张表)

这篇博客详细介绍了在JPA和Hibernate中如何映射继承关系,特别是根类Company与Employee类的一对多双向关联。Employee作为抽象类,拥有HourlyEmployee和SalariedEmployee两个子类。通过@OneToMany、@Inheritance、@Table、@DiscriminatorColumn等注解,实现了Entity类在数据库表中的表示和不同类型员工的区分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

表的结构如下:
在这里插入图片描述
在域模型中,Company类和Employee类之间为一对多的双向关联关系(假定不允许雇员同时在多个公司兼职),Employee类为抽象类,因此它不能被实例化,它有两个具体的子类:HourlyEmployee类和SalariedEmployee类。由于Java只允许一个类最多有一个直接的父类,因此Employee类、HourlyEmployee类和SalariedEmployee类构成了一棵继承关系树。
在这里插入图片描述

1.映射Company类

Company类与Employee类是一对多的关联关系,Company类有个Set类型的employees属性,它存放了所有的Employee对象。用@OneToMany注解来映射:

  @OneToMany(mappedBy="company",
             targetEntity=Employee.class)
  private Set<Employee> employees=new HashSet<Employee>();

2.映射Employee类

在Employee类中,通过@Inheritance注解指明继承关系的映射方式为InheritanceType.SINGLE_TABLE,通过@Table注解来指定对应的数据库表,通过@DiscriminatorColumn注解来指定数据库表中用来区分Employee类型的字段。以下是Employee类的部分源代码。

/*  Employee.java */
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="EMPLOYEE_TYPE")
@Table(name="EMPLOYEES")
abstract public class Employee implements Serializable {……}

3.映射HourlyEmployee类和SalariedEmployee类

HourlyEmployee类和SalariedEmployee类在数据库中没有对应的表,因此仅仅用@Entity注解声明自身是实体类,并且用@DiscriminatorValue注解来设定自己的类型值。例如,当EMPLOYEES表中EMPLOYEE_TYPE字段取值为“HE”,表明这条记录对应HourlyEmployee对象,当EMPLOYEE_TYPE字段取值为“SE”,表明这条记录对应SalariedEmployee对象。

以下分别是HourlyEmployee类和SalariedEmployee类的部分源代码。

/*  HourlyEmployee.java  */
@Entity
@DiscriminatorValue("HE")
public class HourlyEmployee extends Employee{
  @Column(name="RATE") 
  private double rate;
  ……
}
例程12-10  SalariedEmployee.java
@Entity
@DiscriminatorValue("SE")
public class SalariedEmployee extends Employee {
  @Column(name="SALARY")
  private double salary;
  ……
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Java技术集锦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值