基於代碼複用和模型分離的思想,在項目開發中使用JPA的@MappedSuperclass註解將實體類的多個屬性分別封裝到不一樣的非實體類中。java
1.@MappedSuperclass註解只能標準在類上:@Target({java.lang.annotation.ElementType.TYPE})數據庫
2.標註爲@MappedSuperclass的類將不是一個完整的實體類,他將不會映射到數據庫表,可是他的屬性都將映射到其子類的數據庫字段中。app
3.標註爲@MappedSuperclass的類不能再標註@Entity或@Table註解,也無需實現序列化接口。ide
可是若是一個標註爲@MappedSuperclass的類繼承了另一個實體類或者另一個一樣標註了@MappedSuperclass的類的話,他將可使用@AttributeOverride或@AttributeOverrides註解重定義其父類(不管是不是實體類)的屬性映射到數據庫表中的字段。函數
好比能夠重定義字段名或長度等屬性,使用@AttributeOverride中的子屬性@Column進行具體的定義。性能
注意:對於其父類中標註@Lob註解的屬性將不能重載,而且@AttributeOverride裏的@Column設置都將不起做用。繼承
JPA規範中對@Lob註解並無說明不能同時標註@Column註解,可是在實際使用中Hibernate JPA不支持這中標註方式。接口
4.此外,這樣的類還能夠直接標註@EntityListeners實體監聽器,他的做用範圍僅在其全部繼承類中,而且實體監聽器一樣能夠保被其子類繼承或重載。開發
5.標註爲@MappedSuperclass的類其屬性最好設置爲protected或default類型的,以保證其同一個包下的子類能夠直接調用它的屬性。便於實體監聽器或帶參數構造函數的操做。get
6.因爲標註爲@MappedSuperclass的類將不是一個完整的實體類,所以其不能標註@Table,而且沒法使用@UniqueConstraint設置字段的Unique屬性,這一點以及對屬性類型重載(如重載標註爲@Lob的屬性)的支持JPA規範還有待改進。
7.能夠同時標註@DiscriminatorValue註解,以設定實體子類的實體標識字段的值。該屬性通常是在實體繼承的時候使用的較多,可是在實體映射的時候能夠不用設置。
8.比較實體繼承與實體映射的區別:
實體繼承的三種策略分別是:SINGLE_TABLE(全部繼承的實體都保存在同一張數據庫表中),JOINED(每一個實體子類都將保存在一個單獨的表中),TABLE_PER_CLASS(有繼承關係的全部實體類都將保存在單獨的表中)。
實體映射最相似於JOINED實體繼承方式,他也是將實體子類單獨保存爲一張表,可是二者最大的區別就在於:查詢的時候JOINED使用的是多態查詢,在查詢父類時其全部實體子類的數據也將同時被查詢出,所以查詢時間和性能都將有影響。可是實體映射方式的數據庫查詢等同於沒有實體繼承關係的查詢,也就是說,他僅在實體層體現出一種繼承的關係卻並無在數據庫中體現這樣一種關係,他的操做都是獨立的而且將不會影響到實體子類。