您的位置:首页 > 其它

web进修之—Hibernate 继承映射(5)

2016-04-03 11:51 351 查看
先看三个类的继承关系,Payment是父类,CashPayment和CreditCardPayment是Payment的子类:

 

view plaincopy to clipboardprintpublic class Payment {
protected long id;
private String amount;
// setter,getter
}
public class CashPayment extends Payment {
private String cashType;

// setter,getter
}
public class CreditCardPayment extends Payment {
private String creditCardType;

// setter,getter
}
public class Payment {    protected long id;    private String amount;    // setter,getter}public class CashPayment extends Payment {    private String cashType;    // setter,getter}public class CreditCardPayment extends Payment {    private String creditCardType;    // setter,getter}

 

每个类分层结构一张表

一个父类和他的所有子类共用一张表,父类的id是主键,在数据库中就是这些类的字段都在一张表中。因为对于子类之间来说,子类CraditCardPayment没有子类CashPayment的cashType属性,所以在数据库中的那一列就是NUll,所以映射的时候所有子类的列不能设置not null约束。

每个子类一张表

父类、子类都各有各自的表,子类的表里面只有子类的属性,子类的表通过主键关联到父类的表的主键,相当于子类相对于父类是单向一对一,子类增加一条记录,弗雷跟着增加一条记录。

每个子类对应一张表,但是使用标识(Discriminator)

这样子就可以由父类的记录找到子类的记录。和上面的区别就是在父类的表里面添加了一个标志字段:用来标识是哪一个子类。

混合使用每个类一张表和父子类共用一张表

就是CraditCardPayment单独一张表,CashPayment和父类一张表,也要使用Discriminator。

每个具体类一张表

父类、每个子类对应一张表。子类的表也保存从父类继承来的属性,所有类公用一个id,也就是各个表里面的id是连续的,表之间没有关联关系。这种方式的局限在于,如果一个属性在超类中做了映射,其字段名必须与所有子类表中定义的相同。

每个具体类一张表,使用隐式多态

每个子类一张表,父类没有表,不能直接保存一个父类,也不能保存这种方法的缺陷在于,在 Hibernate 执行多态查询时(polymorphic queries)无法生成带
UNION
的 SQL 语句。

不论使用哪一种方法映射,配置文件都是写在父类Payment的映射文件里面,payment.hbm.xml如下:

view plaincopy to clipboardprint<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="org.lep.hibernate.model" >

<class name="Payment" >
<id name="id" column="payment_id">
<generator class="increment"/>
</id>
<!--父类中的属性-->
<property name="amount" type="string" column="amount"/>

<!--所有类共用一张表 start-->

<!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)-->
<!--<discriminator column="payment_type" type="string"></discriminator>-->
<!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->
<!--<!–子类中的属性–>-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</subclass>-->
<!--<subclass name="CashPayment" discriminator-value="CASH">-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</subclass>-->
<!--所有类共用一张表 end-->

<!--每个子类一张表 start-->
<!--<joined-subclass name="CreditCardPayment">-->
<!--<key column="payment_id"></key>-->
<!--<property name="creditCardType" />-->
<!--</joined-subclass>-->
<!--<joined-subclass name="CashPayment">-->
<!--<key column="payment_id"></key>-->
<!--<property name="cashType" />-->
<!--</joined-subclass>-->
<!--每个子类一张表 end-->

<!--每个子类一张表,使用辨识标志 start-->

<!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)-->

<!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->
<!--<!–fetch="select"表示在查询payment的时候,不进行外表链接查询CreditCardPayment–>-->
<!--<join table="CreditCardPayment" fetch="select">-->
<!--<key column="payment_id"></key>-->
<!--<!–子类中的属性–>-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</join>-->

<!--</subclass>-->
<!--<subclass name="CashPayment" discriminator-value="CASH">-->
<!--<join table="CashPayment">-->
<!--<key column="payment_id"></key>-->
<!--<!–子类中的属性–>-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</join>-->

<!--</subclass>-->
<!--所有类共用一张表,使用辨识标志 end-->

<!--混合使用每个子类一张表和每个分层结构一张表 start-->
<!--<discriminator column="PAYMENT_TYPE" type="string"/>-->
<!--<!–使用每个分层结构一章表–>-->
<!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</subclass>-->
<!--<!–使用每个子类一张表–>-->
<!--<subclass name="CashPayment" discriminator-value="CASH">-->
<!--<join table="CashPayment">-->
<!--<key column="payment_id"></key>-->
<!--<!–子类中的属性–>-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</join>-->

<!--</subclass>-->
<!--混合使用每个子类一张表和每个分层结构一张表 end-->

<!--每个具体类一张表 start-->
<union-subclass name="CreditCardPayment" table="CreditCardPayment">
<property name="creditCardType" column="credit_cardt_ype"></property>
</union-subclass>
<union-subclass name="CashPayment" table="CashPayment">
<property name="cashType" column="cash_type"></property>
</union-subclass>
<!--每个具体类一张表 end-->
</class>

<!--每个具体类一张表,使用隐式多态,将父类的属性映射到子类的表里 start-->
<!--<class name="CreditCardPayment" table="CreditCardPayment">-->
<!--<id name="id" column="payment_id">-->
<!--<generator class="increment"/>-->
<!--</id>-->
<!--<!–父类中的属性–>-->
<!--<property name="amount" type="string" column="amount"/>-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</class>-->
<!--<class name="CashPayment" table="CashPayment">-->
<!--<id name="id" column="payment_id">-->
<!--<generator class="increment"/>-->
<!--</id>-->
<!--<!–父类中的属性–>-->
<!--<property name="amount" type="string" column="amount"/>-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</class>-->
<!--每个具体类一张表,使用隐式多态 end-->
</hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="org.lep.hibernate.model" >    <class name="Payment" >        <id name="id" column="payment_id">            <generator class="increment"/>        </id>        <!--父类中的属性-->        <property name="amount" type="string" column="amount"/>        <!--所有类共用一张表 start-->        <!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)-->        <!--<discriminator column="payment_type" type="string"></discriminator>-->        <!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->            <!--<!–子类中的属性–>-->            <!--<property name="creditCardType" column="credit_cardt_ype"></property>-->        <!--</subclass>-->        <!--<subclass name="CashPayment" discriminator-value="CASH">-->            <!--<property name="cashType" column="cash_type"></property>-->        <!--</subclass>-->        <!--所有类共用一张表 end-->        <!--每个子类一张表 start-->        <!--<joined-subclass name="CreditCardPayment">-->            <!--<key column="payment_id"></key>-->            <!--<property name="creditCardType" />-->        <!--</joined-subclass>-->        <!--<joined-subclass name="CashPayment">-->            <!--<key column="payment_id"></key>-->            <!--<property name="cashType" />-->        <!--</joined-subclass>-->        <!--每个子类一张表 end-->        <!--每个子类一张表,使用辨识标志 start-->        <!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)-->        <!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->            <!--<!–fetch="select"表示在查询payment的时候,不进行外表链接查询CreditCardPayment–>-->            <!--<join table="CreditCardPayment" fetch="select">-->                <!--<key column="payment_id"></key>-->                <!--<!–子类中的属性–>-->                <!--<property name="creditCardType" column="credit_cardt_ype"></property>-->            <!--</join>-->        <!--</subclass>-->        <!--<subclass name="CashPayment" discriminator-value="CASH">-->            <!--<join table="CashPayment">-->                <!--<key column="payment_id"></key>-->                <!--<!–子类中的属性–>-->                <!--<property name="cashType" column="cash_type"></property>-->            <!--</join>-->        <!--</subclass>-->        <!--所有类共用一张表,使用辨识标志 end-->        <!--混合使用每个子类一张表和每个分层结构一张表 start-->        <!--<discriminator column="PAYMENT_TYPE" type="string"/>-->        <!--<!–使用每个分层结构一章表–>-->        <!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->            <!--<property name="creditCardType" column="credit_cardt_ype"></property>-->        <!--</subclass>-->        <!--<!–使用每个子类一张表–>-->        <!--<subclass name="CashPayment" discriminator-value="CASH">-->            <!--<join table="CashPayment">-->                <!--<key column="payment_id"></key>-->                <!--<!–子类中的属性–>-->                <!--<property name="cashType" column="cash_type"></property>-->            <!--</join>-->        <!--</subclass>-->        <!--混合使用每个子类一张表和每个分层结构一张表 end-->        <!--每个具体类一张表 start-->        <union-subclass name="CreditCardPayment" table="CreditCardPayment">            <property name="creditCardType" column="credit_cardt_ype"></property>        </union-subclass>        <union-subclass name="CashPayment" table="CashPayment">            <property name="cashType" column="cash_type"></property>        </union-subclass>        <!--每个具体类一张表 end-->    </class>    <!--每个具体类一张表,使用隐式多态,将父类的属性映射到子类的表里 start-->    <!--<class name="CreditCardPayment" table="CreditCardPayment">-->        <!--<id name="id" column="payment_id">-->            <!--<generator class="increment"/>-->        <!--</id>-->        <!--<!–父类中的属性–>-->        <!--<property name="amount" type="string" column="amount"/>-->        <!--<property name="creditCardType" column="credit_cardt_ype"></property>-->    <!--</class>-->    <!--<class name="CashPayment" table="CashPayment">-->        <!--<id name="id" column="payment_id">-->            <!--<generator class="increment"/>-->        <!--</id>-->        <!--<!–父类中的属性–>-->        <!--<property name="amount" type="string" column="amount"/>-->        <!--<property name="cashType" column="cash_type"></property>-->    <!--</class>-->    <!--每个具体类一张表,使用隐式多态 end--></hibernate-mapping>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: