久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

傳智播客-jpa與hibernate(3)-繼承映射

 蝸牛手 2011-05-23

傳智播客-jpa與hibernate(3)-繼承映射 收藏

Hibernate支持三種基本的繼承映射策略:每個(gè)類(lèi)分層結(jié)構(gòu)一張表(table per class hierarchy),,每個(gè)子類(lèi)一張表(table per subclass),,每個(gè)具體類(lèi)一張表(table per concrete class),,此外,Hibernate還支持第四種稍有不同的多態(tài)映射策略--隱式多態(tài)(implicit polymorphism) ,。這里只介紹前三種,,最后一種請(qǐng)參閱相關(guān)文檔。代碼示例為注解方式,,配置方式請(qǐng)參閱文檔,。

每個(gè)類(lèi)分層結(jié)構(gòu)一張表(table per class hierarchy)
也稱(chēng)單表策略,,就是一棵繼承樹(shù)映射為一張表,或者說(shuō)將一棵繼承樹(shù)里所有類(lèi)的信息不重復(fù)地放到一張表里,。因?yàn)樗械母缸宇?lèi)都在一張表里體現(xiàn),,所以還需要一個(gè)額外的字段以區(qū)分每條記錄代表的具體的類(lèi)別。

舉例來(lái)說(shuō),,有父類(lèi)Employee(雇員),,子類(lèi)HE(鐘點(diǎn)工),同級(jí)子類(lèi)SE(正式員工),;HE和SE的區(qū)別在于薪資,,HE以時(shí)效計(jì),字段為rate,,SE以月薪計(jì),,字段為salary;還有一個(gè)字段etype作為具體類(lèi)別信息的區(qū)分標(biāo)識(shí),。

很明顯,,rate和salary是互斥的。所以這兩個(gè)字段應(yīng)當(dāng)允許為空,,而且實(shí)際操作的時(shí)候必然會(huì)有一個(gè)字段列的冗余,。etype對(duì)于每個(gè)類(lèi)別信息自身而言,也可以視為是一個(gè)冗余字段,。所以這個(gè)策略一般在父類(lèi)的屬性字段占總字段的權(quán)重大的時(shí)候較為適用。
示例代碼:
@Entity
@Table(name="jpa_inherit_single_ess")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="etype",discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue(value="ee")
public class Employee {...}

@Entity
@DiscriminatorValue(value="he")
public class HE extends Employee {...}

@Entity
@DiscriminatorValue(value="se")
public class SE extends Employee {...}

NOTE: 查詢(xún)的時(shí)候不是用entityManager.find(XXX.class, serialable),??梢杂胑ntityManager.createQuery("select he from HE he").getResultList(),打印的sql語(yǔ)句是:select ... from jpa_inherit_single_ess where etype = 'he',。

每個(gè)子類(lèi)一張表(table per subclass)
每個(gè)類(lèi)建一個(gè)表,,子表只存放子類(lèi)自身屬性,但是有都有同名主鍵,,并通過(guò)主鍵關(guān)聯(lián)到父類(lèi)表,,因而關(guān)系模型實(shí)際上是一對(duì)一關(guān)聯(lián)。這樣就沒(méi)有第一種方式那么多冗余字段,。子類(lèi)屬性字段的權(quán)重大時(shí)較為適用,。

還是上述例子,父類(lèi)Employee(雇員),,子類(lèi)HE(鐘點(diǎn)工),,同級(jí)子類(lèi)SE(正式員工)在這個(gè)策略里需要三張對(duì)應(yīng)的表,父類(lèi)表主鍵字段假定為id,,HE和SE表使用同名主鍵,,并與父類(lèi)表主鍵id關(guān)聯(lián),。


示例代碼:
@Entity(name="EmployeeJoined")
@Table(name="jpa_inherit_joined_ees")
@Inheritance(strategy=InheritanceType.JOINED)
public class Employee {...}

@Entity(name="HEJoined")
@Table(name="jpa_inherit_joined_hes")
@PrimaryKeyJoinColumn(name="eid")
public class HE extends Employee {...}

@Entity(name="SEJoined")
@Table(name="jpa_inherit_joined_ses")
@PrimaryKeyJoinColumn(name="eid")
public class SE extends Employee {...}

NOTE:因?yàn)閔es∈ess,所以select he時(shí)打印的sql語(yǔ)句只有一次inner join,,而hes∪ses=ees,,select ees時(shí)印的sql語(yǔ)句有兩次lefte outer join。

有時(shí)候通過(guò)一個(gè)(技術(shù)上或業(yè)務(wù)上)父類(lèi)共享一些公共屬性是很有用的,,同時(shí)還不用將該父類(lèi)作為映射的實(shí)體(也就是該實(shí)體沒(méi)有對(duì)應(yīng)的表),。這個(gè)時(shí)候就需 要使用@MappedSuperclass注解來(lái)進(jìn)行映射。(下文略,,請(qǐng)參見(jiàn)滿江紅翻譯的官方文檔 hibernate_annotations.pdf-->2.2.4.4從父類(lèi)繼承的屬性)

每個(gè)具體類(lèi)一張表(table per concrete class)
還是每個(gè)類(lèi)一張表,,不過(guò)表與表之間沒(méi)有關(guān)聯(lián)關(guān)系,每個(gè)表主鍵id值都是唯一的,,主鍵生成策略用table,,而且每個(gè)表都有全部的信息。

示例代碼:
@Entity(name="EmployeeUnion")
@Table(name="jpa_inherit_union_ees")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@TableGenerator(name="tabgen_inherit_union",
    table="jpa_inherit_union_tabgen",
    pkColumnName="pkname",
    valueColumnName="valuename",
    pkColumnValue="currvalue",
    allocationSize=10)
public class Employee {
 @Id
 @GeneratedValue(strategy=GenerationType.TABLE,generator="tabgen_inherit_union")
 private Integer id ;
 ...
}

@Entity(name="HEUnion")
@Table(name="jpa_inherit_union_hes")
public class HE extends Employee {...}

@Entity(name="SEUnion")
@Table(name="jpa_inherit_union_ses")
public class SE extends Employee {...}

下面的內(nèi)容引自《深入淺出Hibernate》6.5.6類(lèi)繼承樹(shù),,有助于更好地理解hibernate的繼承映射,。
hibernate 操作的持久化對(duì)象是POJO。hibernate并不關(guān)心,,也不會(huì)關(guān)心某個(gè)java類(lèi)是否繼承自某個(gè)基類(lèi),,甚至是否是某棵繼承樹(shù)上的一個(gè)節(jié)點(diǎn)。 hibernate能做的,,就是對(duì)這個(gè)java類(lèi)的屬性進(jìn)行操作,,把它們與數(shù)據(jù)庫(kù)中的內(nèi)容按照規(guī)定的規(guī)則進(jìn)行同步。而hibernate的 subclass定義是為了實(shí)現(xiàn)不同的持久化子類(lèi)采取不同的映射策略,,這并不需要和你的POJO的繼承樹(shù)完全一一對(duì)應(yīng),。

(圖片以后再傳)

假設(shè)我們的程序處理是倉(cāng)庫(kù)保管部分,只需要在一個(gè)表中做一個(gè)type字段來(lái)分出“槍支”,,“火箭筒”,,“單兵對(duì)空導(dǎo)彈”(作者難道是國(guó)防科大出 身?,?,?)這3種類(lèi)型,分別放在不同的倉(cāng)庫(kù)位置,。左邊的POJO繼承樹(shù)中,,則為了表明保養(yǎng)等級(jí)的不同,可能會(huì)出現(xiàn)中間的抽象類(lèi)層,,比如說(shuō)有制導(dǎo)武器需要定 期對(duì)制導(dǎo)頭進(jìn)行測(cè)試檢查及保養(yǎng),,而這完全可以不出現(xiàn)在持久化類(lèi)繼承樹(shù)中。持久化策略的實(shí)現(xiàn)是非常靈活自由的。(和上文的 @MappedSuperclass有關(guān)聯(lián)么,?,?)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多