首先看一下最顶层的父类EmployeeEO,代码如下所示。
EmployeeEO
@Entity
@Table(name = "tb_employee")
/**继承映射策略*/
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
/**标识字段定义*/
@DiscriminatorColumn(
name="employee_type",discriminatorType=DiscriminatorType.STRING
)
/**该类的标识*/
@DiscriminatorValue("employee")
public class EmployeeEO implements Serializable {
private Integer id;
private String name;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在最顶层的父类中,通常要做以下映射:
l 使用@Entity注释,标识该类以及所有的子类都映射到指定的表中,如果不标注,也可使用默认值。
l 使用@Inheritance注释,标识该类的子类继承映射的方式,该注释的定义如一下所示:
@Target({TYPE}) @Retention(RUNTIME)
public @interface Inheritance {
InheritanceType strategy() default SINGLE_TABLE;
}
其中,InheritanceType有三种类型,即7.4.2小节中讲述的三种类型,三种类型定义为常量,默认为SINGLE_TABLE。
public enum InheritanceType
{ SINGLE_TABLE, JOINED, TABLE_PER_CLASS };
SINGLE_TABLE表示继承关系的实体保存在一个表;JOINED表示每个实体子类保存在一个表;TABLE_PER_CLASS表示每个实体类保存在一个表。这里使用的是第一种策略,所以定义的代码如下所示:
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
l 使用@DiscriminatorColumn注释,标识改继承层次上所区别每个实体的类型字段。它的定义如以下所示:
@Target({TYPE}) @Retention(RUNTIME)
public @interface DiscriminatorColumn {
String name() default "DTYPE";
DiscriminatorType discriminatorType() default STRING;
String columnDefinition() default "";
int length() default 31;
}
其中,@DiscriminatorColumn在使用时要注意以下这些问题。
(1)@DiscriminatorColumn只能标注在顶层的类中,而不能标注在子类中。
(2)@DiscriminatorColumn只在继承策略为“SINGLE_TABLE”和“JOINED”时使用。
(3)name属性表示所标识具体类型的字段名称,默认为“DTYPE”,例如本例中使用的是字段“employee_type”,所以定义如下。
@DiscriminatorColumn(name="employee_type")
(4)discriminatorType属性表示标识值的类型,默认为STRING字符串。它使用的枚举类型如下所示。
public enum DiscriminatorType { STRING, CHAR, INTEGER };
也就是说,标识值可以为String、Char或者Integer
(5)columnDefinition属性表示生成字段的DDL语句,与@Column中的columnDefinition属性类似。
(6)length属性表示为标识值的长度,默认为31。该属性只在使用DiscriminatorType. STRING时才需要设置。
l 使用@DiscriminatorValue注释,标注该实体类所实体标识字段的值,它的定义如下:
@Target({TYPE}) @Retention(RUNTIME)
public @interface DiscriminatorValue {
String value();
}
value的值表示所该实体的标注值。例如,标识字段“employee_type”的值为“employee”时可以认为是EmployeeEO实体。代码设置如下所示:
@DiscriminatorValue("employee")