欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Class Hierachy的映射策略之T/CCIP

系統(tǒng) 1818 0

Hibernate 作為ORM,面對的一個問題是:一個方面是關(guān)系型的數(shù)據(jù)庫,另一面是Java Object。Java作為一種面向?qū)ο蟮恼Z言支持繼承關(guān)系。Hibernate本身提供了4種策略將繼承關(guān)系映射到關(guān)系型的數(shù)據(jù)庫中。他們分別是:

?

  1. Table Per Concrete Class with Implicit Polymorphism : 每個Concrete Class 對應(yīng)一張Table。利用Hibernate內(nèi)部的機制來實現(xiàn)多態(tài)型的查詢。對于SuperClass Query是分成對Concrete Class的獨立Query組合起來的。
  2. Table Per Concrete Class with Union : 每個Concrete Class 對應(yīng)一張Table。對于SuperClass Query是通過Union的方式來實現(xiàn)的。
  3. Table Per Class Hierarchy : 將整個Class Hierachy的關(guān)系Mapping到一張Table中,通過discriminator來區(qū)分具體的Concrete Class。
  4. Table Per SubClass:對于Class Hierachy圖中的每個類都對應(yīng)有一張Table。

這些策略各有特點,應(yīng)用場合不同。在具體實現(xiàn)的時候,應(yīng)該仔細選擇。

?

一、例子的背景:

?

?假如我們有如下的類的關(guān)系,需要將他們mapping到數(shù)據(jù)庫中

?

??每個類的代碼如下:

    package org.example.hibernate.domain;

//BillDetail SuperClass
public class BillingDetail {
	
	private Long id;
	
	private String owner;
	
	//省略相應(yīng)的get/set accessor
}

  

?

    package org.example.hibernate.domain;

//Concrete Class BankAccount
public class BankAccount extends BillingDetail{
	
	private String account; 
	
	private String bankName; 
	
	private String swift;
	
	//省略相應(yīng)的get/set accessor
}

  

?

    package org.example.hibernate.domain;

//Concrete Class CreditCard
public class CreditCard extends BillingDetail {
	
	private String number; 
	
	private String expMonth;
	
	private String expYear;	

	//省略相應(yīng)的get/set  accessor
}

  

?

二、使用T/CCIP(Table Per Concrete Class with Implicit Polymorphism)策略來映射

1. 只對Concrete Class建立Table,SuperClass中的property,直接mapping到Concrete Class相應(yīng)Table的column

2. 對于Concrete Class的mapping,就如同沒有SuperClass的普通Class一樣mapping。

?

?? Mapping File如下:

    <?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <!-- CreditCard Class Mapping Section-->
    <class name="org.example.hibernate.domain.CreditCard" 
           table="CREDITCARD" polymorphism="implicit">
        
        <id name="id" column="IDNUM" type="long">
            <generator class="native"/>
        </id>
        
        <property name="owner" type="string" column="OWNER" length="30"/>
	    
        <property name="number" type="string" column="NUMBER_CODE" length="20"/>
        
        <property name="expMonth" type="string" column="EXP_MONTH" length="2"/>
	    
        <property name="expYear" type="string" column="EXP_YEAR" length="4"/>

    </class>
     
    <!-- BankAccount Class Mapping Section-->
    <class name="org.example.hibernate.domain.BankAccount" 
           table="BANK_ACCOUNT" polymorphism="implicit">

        <id name="id" column="IDNUM" type="long">
            <generator class="native"/>
        </id>
        
        <property name="owner" type="string" column="OWNER" length="30"/>

        <property name="account" type="string" column="ACCOUNT" length="20"/>

        <property name="bankName" type="string" column="BANK_NAME" length="255"/>

        <property name="swift" type="string" column="SWIFT" length="3"/>

    </class>        

</hibernate-mapping>

  

?

如Mapping File中看到的,CreditCard和BankAccount的Id都是采用Hibernate的native策略。當Session對CreditCard和BankAccount的instance做save的時候,insert到相應(yīng)table中的idnum欄位的value可能是一樣的。因為他們的Hibernate Id 產(chǎn)生策略獨立的,彼此沒有任何的關(guān)系。?

    //Transaction Commit以后,cc11的Id Value是1
CreditCard cc11 = new CreditCard();
cc11.setOwner("jessecia");
cc11.setNumber("123123123123123");		
session.save(cc11);

//Transaction Commit以后,ba11的Id Value是1
BankAccount ba11 = new BankAccount();
ba11.setOwner("jessecia");
ba11.setBankName("GBDFB"); 	
session.save(ba11);
  

?

??? 而對于BillingDetail的polymorphic query,則分成2個獨立的對CreditCard和BankAccount表的查詢SQL來獲得。Java代碼如下:

    Criteria criteria = session.createCriteria(BillingDetail.class);
List<BillingDetail> list = criteria.list();
  

???

?? 產(chǎn)生的SQL如下:?

    select this_.IDNUM as IDNUM0_0_
     , this_.NUMBER_CODE as NUMBER2_0_0_
     , this_.EXP_MONTH as EXP3_0_0_
     , this_.EXP_YEAR as EXP4_0_0_
     , this_.OWNER as OWNER0_0_ 
from CREDITCARD this_

select this_.IDNUM as IDNUM1_0_
     , this_.ACCOUNT as ACCOUNT1_0_
     , this_.BANK_NAME as BANK3_1_0_
     , this_.SWIFT as SWIFT1_0_
     , this_.OWNER as OWNER1_0_ 
from BANK_ACCOUNT1 this_
  

?

? T/CCIP方式的結(jié)論:

1.??應(yīng)用場合:不適合于Polymorphic Association的應(yīng)用場合。也就是說SupperClass和其他的Persistent Class發(fā)生關(guān)系。

2.? 擴展性:當SuperClass增加新的Property的時候,每個Concrete Class相應(yīng)的Table都需要新增Column

?

?下一篇:Class Hierachy的映射策略之T/CCU

?

Class Hierachy的映射策略之T/CCIP


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲第一成人在线 | 欧美另类亚洲 | 日韩成人在线视频 | 久久久久免费观看 | 天天干天天操天天做 | 亚洲精品99 | 国产精品小视频在线观看 | 欧美zozozo人禽交免费观看 | 欧美高清不卡午夜精品免费视频 | 亚洲精品久久久久中文字幕欢迎你 | 激情网五月天 | 99热.com| 亚州精品天堂中文字幕 | 成人免费在线视频网站 | 成人毛片网站 | 日韩成人在线播放 | 最新日本中文字幕在线观看 | 国产精品久久久久久久久久日本 | 免费国产黄频在线观看视频 | 色网站免费视频 | 午夜影院操 | 国产精品97在线 | 夜夜狠狠操 | 韩国资源视频一区二区三区 | 2020国产精品视频免费 | 一区二区中文 | 成人午夜视频免费 | 狠狠躁夜夜躁人人爽天天段 | 中文一区二区 | 99精品在线观看 | avbobo在线| 黑色丝袜美女被狂躁 | 亚洲视频在线网 | 中文一区二区 | 性高湖久久久久久久久aaaaa | 日韩在线播放网址 | 日韩精品一区在线观看 | 欧美free性 | 国产精品成人国产乱一区 | 国产成人免费视频网站高清观看视频 | 久久综合视频网站 |