三、使用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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

