hibernate继承的三种映射策略( Inheritance mapping)

来源:互联网 发布:q币卡充值中心软件 编辑:程序博客网 时间:2024/04/27 06:35

继承的三种映射策略


每个类级别一个表(父类和子类公用一张表)

<class name="Payment" table="PAYMENT">    <id name="id" type="long" column="PAYMENT_ID">        <generator class="native"/>    </id>    <discriminator column="PAYMENT_TYPE" type="string"/>    <property name="amount" column="AMOUNT"/>    ...    <subclass name="CreditCardPayment" discriminator-value="CREDIT">        <property name="creditCardType" column="CCTYPE"/>        ...    </subclass>    <subclass name="CashPayment" discriminator-value="CASH">        ...    </subclass>    <subclass name="ChequePayment" discriminator-value="CHEQUE">        ...    </subclass></class>


   discriminator 指定识别者列
   discriminator-value 识别者列的值
   约束:子类属性不能运用非空约束

 支持各种多态映射策略


父类和每个子类一张表

<class name="Payment" table="PAYMENT">    <id name="id" type="long" column="PAYMENT_ID">        <generator class="native"/>    </id>    <property name="amount" column="AMOUNT"/>    ...    <joined-subclass name="CreditCardPayment" table="CREDIT_PAYMENT">        <key column="PAYMENT_ID"/>        <property name="creditCardType" column="CCTYPE"/>        ...    </joined-subclass>    <joined-subclass name="CashPayment" table="CASH_PAYMENT">        <key column="PAYMENT_ID"/>        ...    </joined-subclass>    <joined-subclass name="ChequePayment" table="CHEQUE_PAYMENT">        <key column="PAYMENT_ID"/>        ...    </joined-subclass></class>



子类表例如CHEQUE_PAYMENT中<key column="PAYMENT_ID"/>指定了PAYMENT_ID当前列关联父表,
并且当前列为为主键主键列


<class name="Payment" table="PAYMENT">    <id name="id" type="long" column="PAYMENT_ID">        <generator class="native"/>    </id>    <discriminator column="PAYMENT_TYPE" type="string"/>    <property name="amount" column="AMOUNT"/>    ...    <subclass name="CreditCardPayment" discriminator-value="CREDIT">        <join table="CREDIT_PAYMENT">            <key column="PAYMENT_ID"/>            <property name="creditCardType" column="CCTYPE"/>            ...        </join>    </subclass>    <subclass name="CashPayment" discriminator-value="CASH">        <join table="CASH_PAYMENT">            <key column="PAYMENT_ID"/>            ...        </join>    </subclass>    <subclass name="ChequePayment" discriminator-value="CHEQUE">        <join table="CHEQUE_PAYMENT" fetch="select">            <key column="PAYMENT_ID"/>            ...        </join>    </subclass></class>



join和subclass的联合用法,这种用法可以和上面的joined-subclass联合一起使用,
子类一张表
<class name="Payment">    <id name="id" type="long" column="PAYMENT_ID">        <generator class="sequence"/>    </id>    <property name="amount" column="AMOUNT"/>    ...    <union-subclass name="CreditCardPayment" table="CREDIT_PAYMENT">        <property name="creditCardType" column="CCTYPE"/>        ...    </union-subclass>    <union-subclass name="CashPayment" table="CASH_PAYMENT">        ...    </union-subclass>    <union-subclass name="ChequePayment" table="CHEQUE_PAYMENT">        ...    </union-subclass></class>



原文有 The identity generator strategy is not allowed in union subclass inheritance.
The primary key seed has to be shared across all unioned subclasses of a hierarchy
意思是子类共享父类生成的id,子类自己不能够定义id生成器

隐式多态关联


<class name="CreditCardPayment" table="CREDIT_PAYMENT">    <id name="id" type="long" column="CREDIT_PAYMENT_ID">        <generator class="native"/>    </id>    <property name="amount" column="CREDIT_AMOUNT"/>    ...</class><class name="CashPayment" table="CASH_PAYMENT">    <id name="id" type="long" column="CASH_PAYMENT_ID">        <generator class="native"/>    </id>    <property name="amount" column="CASH_AMOUNT"/>    ...</class><class name="ChequePayment" table="CHEQUE_PAYMENT">    <id name="id" type="long" column="CHEQUE_PAYMENT_ID">        <generator class="native"/>    </id>    <property name="amount" column="CHEQUE_AMOUNT"/>    ...</class>



使用隐式多态的策略,子类中声明父类的字段amount,
这种策略不支持many-to-one的映射策略

使用any标签建立多态映射策略


继承映射策略和多态支持


0 0