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>  

原文地址:https://www.cnblogs.com/sunshine-2015/p/5349540.html