zoukankan      html  css  js  c++  java
  • web进修之—Hibernate 继承映射(5)

    先看三个类的继承关系,Payment是父类,CashPayment和CreditCardPayment是Payment的子类:

    1. public class Payment {   
    2.     protected long id;   
    3.     private String amount;   
    4.     // setter,getter   
    5. }   
    6. public class CashPayment extends Payment {   
    7.     private String cashType;   
    8.   
    9.     // setter,getter   
    10. }   
    11. public class CreditCardPayment extends Payment {   
    12.     private String creditCardType;   
    13.   
    14.     // setter,getter   
    15. }  

    每个类分层结构一张表

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

    每个子类一张表

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

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

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

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

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

    每个具体类一张表

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

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

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

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

    1. <!DOCTYPE hibernate-mapping PUBLIC   
    2.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   
    3.         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">  
    4.   
    5. <hibernate-mapping package="org.lep.hibernate.model" >  
    6.   
    7.     <class name="Payment" >  
    8.         <id name="id" column="payment_id">  
    9.             <generator class="increment"/>  
    10.         </id>  
    11.         <!--父类中的属性-->  
    12.         <property name="amount" type="string" column="amount"/>  
    13.   
    14.         <!--所有类共用一张表 start-->  
    15.   
    16.         <!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)-->  
    17.         <!--<discriminator column="payment_type" type="string"></discriminator>-->  
    18.         <!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->  
    19.             <!--&lt;!&ndash;子类中的属性&ndash;&gt;-->  
    20.             <!--<property name="creditCardType" column="credit_cardt_ype"></property>-->  
    21.         <!--</subclass>-->  
    22.         <!--<subclass name="CashPayment" discriminator-value="CASH">-->  
    23.             <!--<property name="cashType" column="cash_type"></property>-->  
    24.         <!--</subclass>-->  
    25.         <!--所有类共用一张表 end-->  
    26.   
    27.         <!--每个子类一张表 start-->  
    28.         <!--<joined-subclass name="CreditCardPayment">-->  
    29.             <!--<key column="payment_id"></key>-->  
    30.             <!--<property name="creditCardType" />-->  
    31.         <!--</joined-subclass>-->  
    32.         <!--<joined-subclass name="CashPayment">-->  
    33.             <!--<key column="payment_id"></key>-->  
    34.             <!--<property name="cashType" />-->  
    35.         <!--</joined-subclass>-->  
    36.         <!--每个子类一张表 end-->  
    37.   
    38.         <!--每个子类一张表,使用辨识标志 start-->  
    39.   
    40.         <!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)-->  
    41.   
    42.         <!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->  
    43.             <!--&lt;!&ndash;fetch="select"表示在查询payment的时候,不进行外表链接查询CreditCardPayment&ndash;&gt;-->  
    44.             <!--<join table="CreditCardPayment" fetch="select">-->  
    45.                 <!--<key column="payment_id"></key>-->  
    46.                 <!--&lt;!&ndash;子类中的属性&ndash;&gt;-->  
    47.                 <!--<property name="creditCardType" column="credit_cardt_ype"></property>-->  
    48.             <!--</join>-->  
    49.   
    50.         <!--</subclass>-->  
    51.         <!--<subclass name="CashPayment" discriminator-value="CASH">-->  
    52.             <!--<join table="CashPayment">-->  
    53.                 <!--<key column="payment_id"></key>-->  
    54.                 <!--&lt;!&ndash;子类中的属性&ndash;&gt;-->  
    55.                 <!--<property name="cashType" column="cash_type"></property>-->  
    56.             <!--</join>-->  
    57.   
    58.         <!--</subclass>-->  
    59.         <!--所有类共用一张表,使用辨识标志 end-->  
    60.   
    61.         <!--混合使用每个子类一张表和每个分层结构一张表 start-->  
    62.         <!--<discriminator column="PAYMENT_TYPE" type="string"/>-->  
    63.         <!--&lt;!&ndash;使用每个分层结构一章表&ndash;&gt;-->  
    64.         <!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->  
    65.             <!--<property name="creditCardType" column="credit_cardt_ype"></property>-->  
    66.         <!--</subclass>-->  
    67.         <!--&lt;!&ndash;使用每个子类一张表&ndash;&gt;-->  
    68.         <!--<subclass name="CashPayment" discriminator-value="CASH">-->  
    69.             <!--<join table="CashPayment">-->  
    70.                 <!--<key column="payment_id"></key>-->  
    71.                 <!--&lt;!&ndash;子类中的属性&ndash;&gt;-->  
    72.                 <!--<property name="cashType" column="cash_type"></property>-->  
    73.             <!--</join>-->  
    74.   
    75.         <!--</subclass>-->  
    76.         <!--混合使用每个子类一张表和每个分层结构一张表 end-->  
    77.   
    78.         <!--每个具体类一张表 start-->  
    79.         <union-subclass name="CreditCardPayment" table="CreditCardPayment">  
    80.             <property name="creditCardType" column="credit_cardt_ype"></property>  
    81.         </union-subclass>  
    82.         <union-subclass name="CashPayment" table="CashPayment">  
    83.             <property name="cashType" column="cash_type"></property>  
    84.         </union-subclass>  
    85.         <!--每个具体类一张表 end-->  
    86.     </class>  
    87.   
    88.     <!--每个具体类一张表,使用隐式多态,将父类的属性映射到子类的表里 start-->  
    89.     <!--<class name="CreditCardPayment" table="CreditCardPayment">-->  
    90.         <!--<id name="id" column="payment_id">-->  
    91.             <!--<generator class="increment"/>-->  
    92.         <!--</id>-->  
    93.         <!--&lt;!&ndash;父类中的属性&ndash;&gt;-->  
    94.         <!--<property name="amount" type="string" column="amount"/>-->  
    95.         <!--<property name="creditCardType" column="credit_cardt_ype"></property>-->  
    96.     <!--</class>-->  
    97.     <!--<class name="CashPayment" table="CashPayment">-->  
    98.         <!--<id name="id" column="payment_id">-->  
    99.             <!--<generator class="increment"/>-->  
    100.         <!--</id>-->  
    101.         <!--&lt;!&ndash;父类中的属性&ndash;&gt;-->  
    102.         <!--<property name="amount" type="string" column="amount"/>-->  
    103.         <!--<property name="cashType" column="cash_type"></property>-->  
    104.     <!--</class>-->  
    105.     <!--每个具体类一张表,使用隐式多态 end-->  
    106. </hibernate-mapping>  

  • 相关阅读:
    第一课 JSON的简介
    xml 简介
    前端面试题汇总(长期更新)
    HTML5中的canvas
    AJAX第一课 AJAX的学习和简介
    margin:0 auto和text-aglin:center的区别
    js中的正则表达式
    border和box-shadow
    css中的伪类
    (素材源码)猫猫学IOS(十五)UI之曾经大热的打砖块小游戏
  • 原文地址:https://www.cnblogs.com/sunshine-2015/p/5349540.html
Copyright © 2011-2022 走看看