Nonentity Base Class


在設計類別時,您也許會有個父類別(抽象或非抽象),當中定義了所有的子類別所必須繼承的屬性,然而它不是實體類別,無需對應至任何的表格,然而您又想將一些映射的預設資訊寫在當中,子類別繼承之後,那些映射資訊也跟著繼承,必要時您又可以重新定義映射資訊。

此時您可以在該父類別上標註@MappedSuperclass,例如:
@MappedSuperclass
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 欄位
    ....
}

接著實體子類別再繼承:
@Entity
@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 欄位
    ....
}

若有多個屬性必須重新定義,則使用@AttributeOverrides,例如:
@AttributeOverrides({
        @AttributeOverride(name="xxx", column=@Column("USER_XXX")),
        @AttributeOverride(name="ooo", column=@Column("USER_OOO"))
})