三、使用T/CCU(Table Per Concrete Class with Union)策略來映射 ?
1. 只對Concrete Class建立Table,SuperClass中的property,直接mapping到Concrete Class相應Table的column
2. 對于Concrete Class的mapping,使用union-subclass的方式來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> <class name="org.example.hibernate.domain.BillingDetail" abstract="true"> <!-- 必須聲明abstract="true"--> <id name="id" column="IDNUM" type="long"> <generator class="hilo"/> </id> <property name="owner" type="string" column="OWNER" length="30" /> <union-subclass name="org.example.hibernate.domain.CreditCard" table="CREDIT_CARD"> <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" /> </union-subclass> <union-subclass name="org.example.hibernate.domain.BankAccount" table="BANK_ACCOUNT"> <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" /> </union-subclass> </class> </hibernate-mapping>
?
1.當對Concrete Class做save的時候,會首先generate id,以確保該id為2張table的唯一。
CreditCard cc21 = new CreditCard(); cc21.setOwner("jessecia"); cc21.setNumber("123123123123123"); session.save(cc21);
?
?? 相應的SQL
select max(ids_.IDNUM) from ( select IDNUM from CREDIT_CARD union select IDNUM from BANK_ACCOUNT ) ids_ insert into CREDIT_CARD (OWNER, NUMBER_CODE, EXP_MONTH, EXP_YEAR, IDNUM) values (?, ?, ?, ?, ?)
?
?
2.對于BillDetail的Query轉為union方式獲得。??
List list = session.createQuery("from BillingDetail2 bd1 where bd1.owner = :owner") .setParameter("owner", "jessecia") .list();
?????
???相應SQL如下:
select billingdet0_.IDNUM as IDNUM0_ , billingdet0_.OWNER as OWNER0_ , billingdet0_.NUMBER_CODE as NUMBER1_1_ , billingdet0_.EXP_MONTH as EXP2_1_ , billingdet0_.EXP_YEAR as EXP3_1_ , billingdet0_.ACCOUNT as ACCOUNT2_ , billingdet0_.BANK_NAME as BANK2_2_ , billingdet0_.SWIFT as SWIFT2_ , billingdet0_.clazz_ as clazz_ from ( select IDNUM , null as SWIFT , EXP_YEAR , null as ACCOUNT , OWNER , EXP_MONTH , NUMBER_CODE , null as BANK_NAME , 1 as clazz_ from CREDIT_CARD union select IDNUM , SWIFT , null as EXP_YEAR , ACCOUNT , OWNER , null as EXP_MONTH , null as NUMBER_CODE , BANK_NAME , 2 as clazz_ from BANK_ACCOUNT ) billingdet0_ where billingdet0_.OWNER=?
?
?上一篇:Class Hierachy的映射策略之T/CCIP
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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