表的结构如下:
在域模型中,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;
……
}