在設計類別時,您也許會有個父類別(抽象或非抽象),當中定義了所有的子類別所必須繼承的屬性,然而它不是實體類別,無需對應至任何的表格,然而您又想將一些映射的預設資訊寫在當中,子類別繼承之後,那些映射資訊也跟著繼承,必要時您又可以重新定義映射資訊。
此時您可以在該父類別上標註@MappedSuperclass,例如:
@MappedSuperclass
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private Long age;
....
}
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private Long age;
....
}
當實體子類別繼承之時:
@Entity
@Table(name="T_USER")
@Inheritance(strategy=InheritanceType.JOINED)
public class User implements Serializable {
// 被繼承的 id 會映射至 T_USER.ID 欄位
// 被繼承的 name 會映射至 T_USER.NAME 欄位
// 被繼承的 age 會映射至 T_USER.AGE 欄位
....
}
@Table(name="T_USER")
@Inheritance(strategy=InheritanceType.JOINED)
public class User implements Serializable {
// 被繼承的 id 會映射至 T_USER.ID 欄位
// 被繼承的 name 會映射至 T_USER.NAME 欄位
// 被繼承的 age 會映射至 T_USER.AGE 欄位
....
}
接著實體子類別再繼承:
@Entity
@Table(name="T_NOBODY")
@PrimaryKeyJoinColumn(name="NOBODY_ID")
public class Nobody extends User {
private String nobodyProp;
....
}
@Table(name="T_NOBODY")
@PrimaryKeyJoinColumn(name="NOBODY_ID")
public class Nobody extends User {
private String nobodyProp;
....
}
而若您想重新定義映射資訊,可以使用@AttributeOverride標註,例如:
@Entity
@Table(name="T_USER")
@Inheritance(strategy=InheritanceType.JOINED)
@AttributeOverride(name="id", column=@Column(name="USER_ID"))
public class User implements Serializable {
// 被繼承的 id 被重新定義映射至 T_USER.USER_ID 欄位
// 被繼承的 name 會映射至 T_USER.NAME 欄位
// 被繼承的 age 會映射至 T_USER.AGE 欄位
....
}
@Table(name="T_USER")
@Inheritance(strategy=InheritanceType.JOINED)
@AttributeOverride(name="id", column=@Column(name="USER_ID"))
public class User implements Serializable {
// 被繼承的 id 被重新定義映射至 T_USER.USER_ID 欄位
// 被繼承的 name 會映射至 T_USER.NAME 欄位
// 被繼承的 age 會映射至 T_USER.AGE 欄位
....
}
若有多個屬性必須重新定義,則使用@AttributeOverrides,例如:
@AttributeOverrides({
@AttributeOverride(name="xxx", column=@Column("USER_XXX")),
@AttributeOverride(name="ooo", column=@Column("USER_OOO"))
})
@AttributeOverride(name="xxx", column=@Column("USER_XXX")),
@AttributeOverride(name="ooo", column=@Column("USER_OOO"))
})