@MappedSuperclass注解的使用说明
轉載自:http://blog.sina.com.cn/s/blog_7085382f0100uk4p.html
?
基于代碼復用和模型分離的思想,在項目開發中使用JPA的@MappedSuperclass注解將實體類的多個屬性分別封裝到不同的非實體類中。
?
1.@MappedSuperclass注解只能標準在類上:@Target({java.lang.annotation.ElementType.TYPE})
?
2.標注為@MappedSuperclass的類將不是一個完整的實體類,他將不會映射到數據庫表,但是他的屬性都將映射到其子類的數據庫字段中。
?
3.標注為@MappedSuperclass的類不能再標注@Entity或@Table注解,也無需實現序列化接口。
但是如果一個標注為@MappedSuperclass的類繼承了另外一個實體類或者另外一個同樣標注了@MappedSuperclass的類的話,他將可以使用@AttributeOverride或@AttributeOverrides注解重定義其父類(無論是否是實體類)的屬性映射到數據庫表中的字段。
比如可以重定義字段名或長度等屬性,使用@AttributeOverride中的子屬性@Column進行具體的定義。
注意:對于其父類中標注@Lob注解的屬性將不能重載,并且@AttributeOverride里的@Column設置都將不起作用。
JPA規范中對@Lob注解并沒有說明不能同時標注@Column注解,但是在實際使用中Hibernate JPA不支持這中標注方式。
?
4.此外,這樣的類還可以直接標注@EntityListeners實體監聽器,他的作用范圍僅在其所有繼承類中,并且實體監聽器同樣可以保被其子類繼承或重載。
?
5.標注為@MappedSuperclass的類其屬性最好設置為protected或default類型的,以保證其同一個包下的子類可以直接調用它的屬性。便于實體監聽器或帶參數構造函數的操作。
?
6.由于標注為@MappedSuperclass的類將不是一個完整的實體類,因此其不能標注@Table,并且無法使用@UniqueConstraint設置字段的Unique屬性,這一點以及對屬性類型重載(如重載標注為@Lob的屬性)的支持JPA規范還有待改進。
?
7.可以同時標注@DiscriminatorValue注解,以設定實體子類的實體標識字段的值。該屬性一般是在實體繼承的時候使用的較多,但是在實體映射的時候可以不用設置。
?
8.比較實體繼承與實體映射的區別:
實體繼承的三種策略分別是:SINGLE_TABLE(所有繼承的實體都保存在同一張數據庫表中),JOINED(每個實體子類都將保存在一個單獨的表中),TABLE_PER_CLASS(有繼承關系的所有實體類都將保存在單獨的表中)。
實體映射最類似于JOINED實體繼承方式,他也是將實體子類單獨保存為一張表,但是兩者最大的區別就在于:查詢的時候JOINED使用的是多態查詢,在查詢父類時其所有實體子類的數據也將同時被查詢出,因此查詢時間和性能都將有影響。但是實體映射方式的數據庫查詢等同于沒有實體繼承關系的查詢,也就是說,他僅在實體層體現出一種繼承的關系卻并沒有在數據庫中體現這樣一種關系,他的操作都是獨立的并且將不會影響到實體子類。
?
Hibernate之jpa實體映射的三種繼承關系
轉載自:http://www.cnblogs.com/shangxiaofei/p/5704321.html
在JPA中,實體繼承關系的映射策略共有三種:單表繼承策略(table per class)、Joined策略(table per subclass)和Table_PER_Class策略。
?
1.單表繼承策略
???
??? 單表繼承策略,父類實體和子類實體共用一張數據庫表,在表中通過一列辨別字段來區別不同類別的實體。具體做法如下:
a.在父類實體的@Entity注解下添加如下的注解:
@Inheritance(Strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name=”辨別字段列名”)
@DiscriminatorValue(父類實體辨別字段列值)
?
b.在子類實體的@Entity注解下添加如下的注解:
@DiscriminatorValue(子類實體辨別字段列值)?
?
?
定義了一個父類
?
?
后定義2個子類
?
?
?
?以上通過列DISCRIMINATOR的不同,區分具體父子實體。
?
實際表結構如下:
WINDOW_FILE? DISCRIMINATOR,ID,NAME,DATE,TYPE,SIZE,FILE_COUNT
?
當你使用WindowFile實體時,實際表的字段為DISCRIMINATOR='WindowFile',SIZE與FILE_COUNT永遠是空
當使用Folder實體時,DISCRIMINATOR='Folder',SIZE永遠是空,FILE_COUNT為實際值。
Document同理,與Folder類似。
?
2.Joined策略
?
??? 父類實體和子類實體分別對應數據庫中不同的表,子類實體的表中只存在其擴展的特殊屬性,父類的公共屬性保存在父類實體映射表中。具體做法:
?
?
?
?
?
@Inheritance(Strategy=InheritanceType.JOINED)
?
子類實體不需要特殊說明。
?
?
?
?
?
?
實際表結構如下:
T_ANIMAL? ID,COLOR,NAME
T_BIRD? SPEED,BIRD(既是外鍵,也是主鍵)
T_DOG? LEGS,DOG_ID(既是外鍵,也是主鍵)
?
3.Table_PER_Class策略:
?
Table_PER_Class策略,父類實體和子類實體每個類分別對應一張數據庫中的表,子類表中保存所有屬性,包括從父類實體中繼承的屬性。具體做法:
只需在父類實體的@Entity注解下添加如下注解:
@Inheritance(Strategy=InheritanceType.TABLE_PER_CLASS)
?
?
?
一旦使用這種策略就意味著你不能使用AUTO generator 和IDENTITY generator,即主鍵值不能采用數據庫自動生成。
?
實際表結構如下:
T_VEHICLE? ID,SPEED
T_CAR? ID,SPEED,ENGINE
轉載于:https://www.cnblogs.com/chrischris/p/5952290.html
總結
以上是生活随笔為你收集整理的@MappedSuperclass注解的使用说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动生成get,set方法
- 下一篇: C++零食:WTL中使用双缓冲避免闪烁