先看三个类的继承关系,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. // setter,getter

  9. }

  10. public class CreditCardPayment extends Payment {

  11. private String creditCardType;
  12. // setter,getter

  13. }
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如下:



  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. <hibernate-mapping package="org.lep.hibernate.model" >
  5. <class name="Payment" >

  6. <id name="id" column="payment_id">

  7. <generator class="increment"/>

  8. </id>

  9. <!--父类中的属性-->

  10. <property name="amount" type="string" column="amount"/>
  11. <!--所有类共用一张表 start-->
  12. <!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)-->

  13. <!--<discriminator column="payment_type" type="string"></discriminator>-->

  14. <!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->

  15. <!--&lt;!&ndash;子类中的属性&ndash;&gt;-->

  16. <!--<property name="creditCardType" column="credit_cardt_ype"></property>-->

  17. <!--</subclass>-->

  18. <!--<subclass name="CashPayment" discriminator-value="CASH">-->

  19. <!--<property name="cashType" column="cash_type"></property>-->

  20. <!--</subclass>-->

  21. <!--所有类共用一张表 end-->
  22. <!--每个子类一张表 start-->

  23. <!--<joined-subclass name="CreditCardPayment">-->

  24. <!--<key column="payment_id"></key>-->

  25. <!--<property name="creditCardType" />-->

  26. <!--</joined-subclass>-->

  27. <!--<joined-subclass name="CashPayment">-->

  28. <!--<key column="payment_id"></key>-->

  29. <!--<property name="cashType" />-->

  30. <!--</joined-subclass>-->

  31. <!--每个子类一张表 end-->
  32. <!--每个子类一张表,使用辨识标志 start-->
  33. <!--用来辨识是那一个类的属性,该字段的取值为PAYMENT、CREDIT或者CASH(如果某一个类没有设置discriminator-valur,默认为该类的全限定名)-->
  34. <!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->

  35. <!--&lt;!&ndash;fetch="select"表示在查询payment的时候,不进行外表链接查询CreditCardPayment&ndash;&gt;-->

  36. <!--<join table="CreditCardPayment" fetch="select">-->

  37. <!--<key column="payment_id"></key>-->

  38. <!--&lt;!&ndash;子类中的属性&ndash;&gt;-->

  39. <!--<property name="creditCardType" column="credit_cardt_ype"></property>-->

  40. <!--</join>-->
  41. <!--</subclass>-->

  42. <!--<subclass name="CashPayment" discriminator-value="CASH">-->

  43. <!--<join table="CashPayment">-->

  44. <!--<key column="payment_id"></key>-->

  45. <!--&lt;!&ndash;子类中的属性&ndash;&gt;-->

  46. <!--<property name="cashType" column="cash_type"></property>-->

  47. <!--</join>-->
  48. <!--</subclass>-->

  49. <!--所有类共用一张表,使用辨识标志 end-->
  50. <!--混合使用每个子类一张表和每个分层结构一张表 start-->

  51. <!--<discriminator column="PAYMENT_TYPE" type="string"/>-->

  52. <!--&lt;!&ndash;使用每个分层结构一章表&ndash;&gt;-->

  53. <!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->

  54. <!--<property name="creditCardType" column="credit_cardt_ype"></property>-->

  55. <!--</subclass>-->

  56. <!--&lt;!&ndash;使用每个子类一张表&ndash;&gt;-->

  57. <!--<subclass name="CashPayment" discriminator-value="CASH">-->

  58. <!--<join table="CashPayment">-->

  59. <!--<key column="payment_id"></key>-->

  60. <!--&lt;!&ndash;子类中的属性&ndash;&gt;-->

  61. <!--<property name="cashType" column="cash_type"></property>-->

  62. <!--</join>-->
  63. <!--</subclass>-->

  64. <!--混合使用每个子类一张表和每个分层结构一张表 end-->
  65. <!--每个具体类一张表 start-->

  66. <union-subclass name="CreditCardPayment" table="CreditCardPayment">

  67. <property name="creditCardType" column="credit_cardt_ype"></property>

  68. </union-subclass>

  69. <union-subclass name="CashPayment" table="CashPayment">

  70. <property name="cashType" column="cash_type"></property>

  71. </union-subclass>

  72. <!--每个具体类一张表 end-->

  73. </class>
  74. <!--每个具体类一张表,使用隐式多态,将父类的属性映射到子类的表里 start-->

  75. <!--<class name="CreditCardPayment" table="CreditCardPayment">-->

  76. <!--<id name="id" column="payment_id">-->

  77. <!--<generator class="increment"/>-->

  78. <!--</id>-->

  79. <!--&lt;!&ndash;父类中的属性&ndash;&gt;-->

  80. <!--<property name="amount" type="string" column="amount"/>-->

  81. <!--<property name="creditCardType" column="credit_cardt_ype"></property>-->

  82. <!--</class>-->

  83. <!--<class name="CashPayment" table="CashPayment">-->

  84. <!--<id name="id" column="payment_id">-->

  85. <!--<generator class="increment"/>-->

  86. <!--</id>-->

  87. <!--&lt;!&ndash;父类中的属性&ndash;&gt;-->

  88. <!--<property name="amount" type="string" column="amount"/>-->

  89. <!--<property name="cashType" column="cash_type"></property>-->

  90. <!--</class>-->

  91. <!--每个具体类一张表,使用隐式多态 end-->

  92. </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">-->
<!--&lt;!&ndash;子类中的属性&ndash;&gt;-->
<!--<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">-->
<!--&lt;!&ndash;fetch="select"表示在查询payment的时候,不进行外表链接查询CreditCardPayment&ndash;&gt;-->
<!--<join table="CreditCardPayment" fetch="select">-->
<!--<key column="payment_id"></key>-->
<!--&lt;!&ndash;子类中的属性&ndash;&gt;-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</join>-->

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

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

<!--混合使用每个子类一张表和每个分层结构一张表 start-->
<!--<discriminator column="PAYMENT_TYPE" type="string"/>-->
<!--&lt;!&ndash;使用每个分层结构一章表&ndash;&gt;-->
<!--<subclass name="CreditCardPayment" discriminator-value="CREDIT">-->
<!--<property name="creditCardType" column="credit_cardt_ype"></property>-->
<!--</subclass>-->
<!--&lt;!&ndash;使用每个子类一张表&ndash;&gt;-->
<!--<subclass name="CashPayment" discriminator-value="CASH">-->
<!--<join table="CashPayment">-->
<!--<key column="payment_id"></key>-->
<!--&lt;!&ndash;子类中的属性&ndash;&gt;-->
<!--<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>-->
<!--&lt;!&ndash;父类中的属性&ndash;&gt;-->
<!--<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>-->
<!--&lt;!&ndash;父类中的属性&ndash;&gt;-->
<!--<property name="amount" type="string" column="amount"/>-->
<!--<property name="cashType" column="cash_type"></property>-->
<!--</class>-->
<!--每个具体类一张表,使用隐式多态 end-->
</hibernate-mapping>

web进修之—Hibernate 继承映射(5)的更多相关文章

  1. web进修之—Hibernate 关系映射(3)

    概述 Hibernate的关系映射是Hibernate使用的难点或者是重点(别担心,不考试哦~),按照不同的分类方式可以对这些映射关系做一个分类,如: 按对象对应关系分: 一对一 多对一/一对多 多对 ...

  2. web进修之—Hibernate起步(1)(2)

    想开始写博客了,尝试了CSDN和cnblog之后还是觉得cnblog更加简洁.专注(不过cnblog不支持搬家),所以把刚刚写的两篇学习博客链接放在这儿,这样这个系列也算是完整了: web进修之—Hi ...

  3. 【JavaEE】Hibernate继承映射,不用多态查询只查父表的方法

    几个月前,我在博问里面发了一个问题:http://q.cnblogs.com/q/64900/,但是一直没有找到好的答案,关闭问题以后才自己解决了,在这里分享一下. 首先我重复一下场景,博问里面举的动 ...

  4. hibernate 继承映射关系( SINGLE_TABLE)

    三种继承映射关系.   1,SINGLE_TABLE   person student  teacher 在一个表中,student和teacher继承自person,通过一个Discriminato ...

  5. Hibernate继承映射(@Inheritance)

    继承映射在 Annotation 中使用 @Inheritance 注解,并且需要使用 strategy 属性指定继承策略,继承策略有 SINGLE_TABLE.TABLE_PER_CLASS 和 J ...

  6. SSH开发实践part3:hibernate继承映射

    0 大家好.上次讲了关于hibernate中双向1-N的映射配置,可以参考:http://www.cnblogs.com/souvenir/p/3784510.html 实际项目中,对象间的关系比较复 ...

  7. Hibernate继承映射

    在面向对象的程序领域中,类与类之间是有继承关系的,例如Java世界中只需要extends关键字就可以确定这两个类的父子关系,但是在关系数据库的世界中,表与表之间没有任何关键字可以明确指明这两张表的父子 ...

  8. web进修之—Hibernate 类型(4)

    本片包含Hibernate的两种类型的简单介绍和集合类型的映射. Hibernate中的两种类型: Entity 自己掌控自己的生命周期,比如Person有addrss属性(关联到另外一张表).age ...

  9. web进修之—Hibernate HQL(7)

    概述 HQL是Hibernate封装成为面向对象的数据库查询语言,具有如下特点: 面向对象,包括继承.多态和关联之类的概念,SQL操作的数据库的表,HQL更像是操作对象 大小写敏感,只对对象和属性敏感 ...

随机推荐

  1. 分布式文件系统 fastdfs搭建

    fastdfs第一步:在home文件夹下建立tar文件夹第二步:cd /home/tar///(Libevent 是一个用C语言编写的.轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( e ...

  2. Java面试题之Redis

    1.redis数据结构有哪些? string,list,hash,set,zset 2.redis为什么是单线程的? redis是基于内存的操作,cpu不是redis的瓶颈,内存大小或网络带宽才是: ...

  3. 【转】javaUDP套接字通信

    Java UDP网络编程 - 最简单示例   转自 http://blog.csdn.net/wintys/article/details/3525643 /** *UDPServer *@autho ...

  4. 关于字符的C++函数

    toupper(), tolower()不会改变原来的字符; 如果输入不是字母, 返回值跟原字符相同. isupper(), islower()..

  5. BZOJ3105-新Nim游戏

    Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴 ...

  6. 微软develop apps在QQ上部分功能的实现

    最近我对微软的develop apps的文档进行了简读,在感叹UWP在支持服务上的全面的同时,我不禁在在常用的APP上对于这些功能支持进行了部分的寻找对应.而我进行功能对照的,就是平时很常用的一款手机 ...

  7. latex 希腊字母表示

    http://blog.sina.com.cn/s/blog_5e16f1770100lxq5.html

  8. 安装easygui

    1.下载0.96的easygui 官网: http://easygui.sourceforge.net/ 2.解压后得到文件夹,里面有两个文件分别为,setup.py和easygui.py 3.在py ...

  9. QQ的发展演变

    在其发展史上,以色列人功不可没.正是四位以色列籍的年轻人,在1996年7月成立的Mirabilis公司,并于同年11月推出了全世界第一个即时通讯软件ICQ,取意为“我在找你”——“I Seek You ...

  10. 【腾讯Bugly干货分享】经典随机Crash之一:线程安全

    本文作者:鲁可--腾讯SNG专项测试组 测试工程师 背景 Android QQ 在2016下半年连着好几个版本二灰 Crash 率都很高,如果说有新需求,一灰的 Crash 率高,还能找点理由,可是开 ...