Hibernate继承策略总共同拥有三种,一种是共用一张表;一种是每一个类一张表,表里面储存子类的信息和父类的信息;另一种是通过表连接的方式。每一个类都有一张表,可是子类相应的表仅仅保存自己的信息,父类相应的表保存父类的信息。它们之间通过子类表和父类表的关联来获取全部的信息。

第一种方式,即共用一张表:

  1. @Entity
  2. @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
  3. @DiscriminatorColumn(name="discriminator", discriminatorType=DiscriminatorType.STRING)//表示区分不同的对象的字段名
  4. @DiscriminatorValue("person")//用来表示该对象是何种对象的,即区分器
  5. public class Parent {
  6. private int id;
  7. private String name;
  8. @Id
  9. @GeneratedValue
  10. public int getId() {
  11. return id;
  12. }
  13. public void setId(int id) {
  14. this.id = id;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. }
  23. @Entity
  24. @DiscriminatorValue("child1")
  25. public class Child1 extends Parent {
  26. private String email;
  27. public String getEmail() {
  28. return title;
  29. }
  30. public void setEmail(String email) {
  31. this.email = email;
  32. }
  33. }
  34. @Entity
  35. @DiscriminatorValue("child2")
  36. public class Child2 extends Parent {
  37. private String address;
  38. public String getAddress() {
  39. return score;
  40. }
  41. public void setAddress(String address) {
  42. this.address = address;
  43. }
  44. }

这样的情况父类和全部子类的全部信息都保存在同一张表里面,通过我们指定的@DiscriminatorColumn相应的@DiscriminatorValue来差别不同的类。 当没有指定@DiscriminatorValue的时候将使用全类名来作为DiscriminatorValue。

另外一种策略是每一个类一张表,保存全部信息:

  1. @Entity
  2. @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
  3. @TableGenerator(        //一个类一张表。最重要的是要保证它们的id由一个生成器产生,@TableGenerator就是为了控制这个的
  4. name="t_gen",
  5. table="t_gen_table",
  6. pkColumnName="t_pk",
  7. valueColumnName="t_value",
  8. pkColumnValue="person_pk",
  9. ,
  10. )
  11. public class Parent {
  12. private int id;
  13. private String name;
  14. @Id
  15. @GeneratedValue(generator="t_gen", strategy=GenerationType.TABLE)//这个就是用表生成器生成的。用同一个生成器就能够控制它们的id不反复
  16. public int getId() {
  17. return id;
  18. }
  19. public void setId(int id) {
  20. this.id = id;
  21. }
  22. public String getName() {
  23. return name;
  24. }
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28. }
  29. @Entity
  30. public class Child2 extends Parent {
  31. private String address;
  32. public String getAddress() {
  33. return score;
  34. }
  35. public void setAddress(String address) {
  36. this.address = address;
  37. }
  38. }
  39. @Entity
  40. public class Child1 extends Parent {
  41. private String email;
  42. public String getEmail() {
  43. return title;
  44. }
  45. public void setEmail(String email) {
  46. this.email = email;
  47. }
  48. }

弟三种方式是採用表连接的方式:

  1. @Entity
  2. @Inheritance(strategy=InheritanceType.JOINED)
  3. public class Parent {
  4. private int id;
  5. private String name;
  6. @Id
  7. @GeneratedValue
  8. public int getId() {
  9. return id;
  10. }
  11. public void setId(int id) {
  12. this.id = id;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. }
  21. @Entity
  22. public class Child2 extends Parent {
  23. private String address;
  24. public String getAddress() {
  25. return score;
  26. }
  27. public void setAddress(String address) {
  28. this.address = address;
  29. }
  30. }
  31. @Entity
  32. public class Child1 extends Parent {
  33. private String email;
  34. public String getEmail() {
  35. return title;
  36. }
  37. public void setEmail(String email) {
  38. this.email = email;
  39. }
  40. }

採用表连接的情况,还是每一个类拥有自己的一张表,仅仅是子类相应的表仅仅保存子类的信息。其父类的信息由父类的表保存。

当须要获取子类的完整信息时通过表连接的方式连接子类的表和父类的表获取相应信息。

能够在子类的表上标注@PrimaryKeyJoinColumn(name="foreignKeyName")指明子类表相对于父类表外键的名称。

Hibernate实体对象继承策略的更多相关文章

  1. Hibernate实体对象三种状态

    Hibernate实体对象生命周期: 1. 自由状态(Transient,临时状态,瞬态) 在内存中自由存在,与数据库无关,未被Hibernate的Session管理 2. 持久状态(Persiste ...

  2. 使用Myeclipse为数据表创建hibernate实体对象

    hibernate是orm框架的一种,orm即Object Relational Mapping,对象映射关系,其主要作用是将数据库(mysql,mssql,oracle)的对象转换为具体编程语言(如 ...

  3. hibernate 实体对象的三种状态以及转换关系。

    最新的Hibernate文档中为Hibernate对象定义了四种状态(原来是三种状态,面试的时候基本上问的也是三种状态),分别是:瞬时态(new, or transient).持久态(managed, ...

  4. Hibernate 实体对象三种状态 :自由,持久,游离

    实体对象的状态及转化: 有了上面关于Hibernate缓存的知识,我们再来介绍实体对象的状态就非常容易理解了. A:自由态对象: 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象 ...

  5. Hibernate实体对象的生命周期(三种状态)

    瞬时状态(Transient) 通过new创建对象后,对象并没有立刻持久化,它并未与数据库中的数据有任何关联,此时Java对象的状态为瞬时状态. Session对于瞬时状态的Java对象是一无所知的, ...

  6. hibernate实体对象的三种状态:自由状态,持久状态,游离状态.

    自由态与游离态的区别: 当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可能还存在一条与它 对应的记录,只是现在这个游离对 ...

  7. JPA实体继承实体的映射策略

    注:这里所说的实体指的是@Entity注解的类 继承映射使用@Inheritance来注解.它的strategy属性的取值由枚举InheritanceType来定义(包含SINGLE_TABLE.TA ...

  8. Hibernate通过实体对象对应数据库表信息

    Hibernate通过实体对象对应数据库表信息,包括:数据库表名称.主键列名.非主键列名等. 获取对象映射缓存管理类: AbstractEntityPersister aep = (AbstractE ...

  9. Hibernate中实体对象的状态

    实体对象的状态 这里的实体对象是指Hibernate的O/R映射关系中的域对象(即O/R中的O).实体对象的生命周期是指实体对象由产生到被GC回收的一段过程,实体对象的生命周期包括3种状态:自由状态( ...

随机推荐

  1. sql: PL/SQL proc

    A PL/SQL block has the following structure: [DECLARE declaration_statements ] BEGIN executable_state ...

  2. 平衡树 - 红黑树(JQuery+Js+Canvas版本的,帮助大家理解)

    红黑树 1.红黑树介绍 年写的一篇论文中获得的.它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的:它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目. 2 ...

  3. arm-linux-gcc下载与安装

    在RHEL 5平台上安装配置arm-linux-gcc  2011-02-23 19:35:40|  分类: 嵌入式开发环境 |  标签: |字号大中小 订阅 . 在linux平台上安装好的基础上,开 ...

  4. codility上的问题(15) Xi 2012

    进入2012年的题 codility上的题目开始变难,变得有意思起来.给定两个长度在[1..300000]的只包含0和1的串S和T,它们是2进制表示的,S表示的数A不大于T表示的数B,即A<=B ...

  5. iOS UIScrollView 停止滑动 减速

    1.UIScrollView 减速 可能通过decelerationRate的属性来设置,它的值域是(0.0,1.0),当decelerationRate设置为0.1时,当手指touch up时就会很 ...

  6. ntohs, ntohl, htons,htonl的比较和详解

    在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题. 这时就可能用到htons(), ntohl(), ntohs(),htons()这4个网络字节顺序与本地字节顺序之间的转换函数 ...

  7. [读书笔记]黑客与画家[Hackers.and.Painters]

    (书生注:这本书写的不错.针对程序员,可以带来不同角度的想法,有助于反思自己的程序员工作.我甚至从中发现了自己爱用铅笔的原因...  尤其是其中关于黑客的定义,包括黑客认为的乐趣和目的,让人更深层次思 ...

  8. [Usaco2008 Feb]Meteor Shower流星雨

    去年偶们湖南遭受N年不遇到冰冻灾害,现在芙蓉哥哥则听说另一个骇人听闻的消息: 一场流星雨即将袭击整个霸中,由于流星体积过大,它们无法在撞击到地面前燃烧殆尽, 届时将会对它撞到的一切东西造成毁灭性的打击 ...

  9. HW Video Acceleration in Chrome/Chromium HTML5 video 视频播放硬件加速

    Introduction Video decode (e.g. YouTube playback) and encode (e.g. video chat applications) are some ...

  10. 联系人数据库设计之AbstractContactsProvider

    个人见解,欢迎交流. 联系人数据库设计,源代码下载请自行去android官网下载. package com.android.providers.contacts; import android.con ...