表的结构如下:
在域模型中,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.TABLE_PER_CLASS。以下是Employee类的部分源代码。
/* Employee.java */
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
abstract public class Employee implements Serializable {
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment",strategy = "increment")
@Column(name="ID")
private Long id;
@Column(name="NAME")
private String name;
@ManyToOne(targetEntity =Company.class)
@JoinColumn(name="COMPANY_ID")
private Company company;
……
}
3.映射HourlyEmployee类和SalariedEmployee类
HourlyEmployee类和SalariedEmployee类在数据库中有对应的表,因此通过@Table注解来指明所对应的表。以下分别是这两个类的部分源代码。
/* HourlyEmployee.java */
@Entity
@Table(name = "HOURLY_EMPLOYEES")
public class HourlyEmployee extends Employee{
@Column(name="RATE")
private double rate;
……
}
/* SalariedEmployee.java */
@Entity
@Table(name = "SALARIED_EMPLOYEES")
public class SalariedEmployee extends Employee {
@Column(name="SALARY")
private double salary;
……
}