Hibernate映射解析---继承映射_第1页
Hibernate映射解析---继承映射_第2页
Hibernate映射解析---继承映射_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、现实世界中有很多种动物,比如: Pig (猪),Bird (鸟)等等,当我用面向对象的思想分 析时,我们一般会将它们的共同部分抽取出来增加一个抽象类 Animal (动物),这样在编写 程序时 Pig 和 Bird 只需要继承它们的父类 Animal 就可以省去很多重复的代码。 Java 代码中 只需要 extends 关键字就可以轻松实现这种继承关系,但是对于我们使用的关系型数据库是 没有任何关键字可以指明这种继承关系的。 为了将这种继承关系反映到数据库中, Hibernate 为我们提供了 3 种解决方案: 1、每个具体类对应一张表 该方案是使继承体系中每一个具体的类都对应数据库中的一张表

2、。示意图如下: 每个子类对应的数据库表都包含了父类的信息, 并且还有自己独有的属性, 每个子类对应 一张表,这个表具备完整的信息,包含了所有父类继承下来的属性映射的字段,这种策略是 使用 union-subclass 标签来定义子类的。 注意:在保存对象的时候 id 不能重复(不能使用数据库的自增方式生成主键) 部分代码展示: ?xml version=1.0? !DOCTYPE hibernate-mapping PUBLIC -/Hibernate/Hibernate Mapping DTD 3.0/EN http:/ hibernate-mapping package=com.hiber

3、nate classname=Animaltable=t_animal abstract=true id name=id generator class=assigned/ /id property name=name/ property name=sex/ union-subclass name=Pig table=t_pig property name=weight/ /union-subclass union-subclass name=Bird table=t_bird property name=height/ /union-subclass /class /hibernate-ma

4、pping 2、每个类一张表 这种策略是使用 joined-subclass 标签来定义子类的。父类、子类都对应一张数 据库表。在父类对应的数据库表中,它存储了所有记录的公共信息,实际上该父类对应的表会包含所有的记录,包括父类和子类的记录;在子类对应的数据库表中,这个表只定义了子 类中所特有的属性映射的字段。子类对应的数据表与父类对应的数据表,通过一对一主键关 联的方式关联起来。 这种策略的示意图: t_animal 表中存储了子类的所有记录,但只记录了他们共有的信息,而他们独有的信息 存储在他们对应的表中, 一条记录要获得其独有的信息, 要通过 t_animal 记录的主键到其对 应的子表中

5、查找主键 一样的记录然后取出它独有的信息。 注意: Joined-subclass 标签的 name 属性是子类的全路径名 class 标签所包含 (这种包含关系正是表明了类 行。 当 Joined-subclass 标签的定义与 class 标签中,添加 extends 属性,里面的 是 Joined-subclass 标签需要包含一个 key 标签,这个标签指定了子类和父类之间是 通过哪个字段来关联的。 如: key column= ”PARENT_KEY_I”D / ,这里的 column , 实际上就是父类的主键对应的映射字段名称。 Joined-subclass 标签, 既可以被 之

6、间的继承关系) ,也可以与 class 标签平 标签平行的时候,需要在 Joined-subclass 父类的全路径名称。 子类的其它属性,像普通类一样,定义在 joined-subclass 标签的内部。 部分代码展示: ?xml version=1.0? !DOCTYPE hibernate-mapping PUBLIC -/Hibernate/Hibernate Mapping DTD 3.0/EN http:/ hibernate-mapping package=com.hibernate class name=Animal table=t_animal id name=id gene

7、rator class=native/ /id property name=name/ property name=sex/ joined-subclass name=Pig table=t_pig key column=pid/ property name=weight/ /joined-subclass joined-subclass name=Bird table=t_bird key column=bid/ property name=height/ /joined-subclass /class /hibernate-mapping 3、每棵(参考: http:/ )类继承树一张表

8、这种策略是使用 subclass 标签来实现的。 因为类继承体系下会有许多个子类, 要 把多个类的信息存 放在一张表中 ,必须有某种 机制来区分 哪些记录是属 于哪个类的。 Hibernate 中的这种机制就是,在表中添加一个字段,用这个字段的 来进行区分。 标签来实现。 在表中添加这个标示列使用 discriminator 该策略的示意图: 将继承体系中的所有类信息表示在同一张表中后, null 。 注意:在 Subclass 标签中,用 discriminator-value 字段(用来区分不同类的字段)的 Subclass 种包含关系正是表明了类之间的继承关系) ,也可以与 只要是这个类

9、没有的属性会被自动赋上 属性来标明本子类的 标签,既可以被 class class 标签平行。 当 discriminator 标签所包含(这 subclass 标签的 定义与 class 标签平行的时候, 需要在 subclass 标签中,添加 extends 属性,里面的 是父类的全路径名称。 部分代码展示: ?xml version=1.0? !DOCTYPE hibernate-mapping PUBLIC -/Hibernate/Hibernate Mapping DTD 3.0/EN http:/ hibernate-mapping package=com.hibernate cl

10、ass name=Animal table=t_animal lazy=false id name=id generator class=native/ /id discriminator column=type type=string/ property name=name/ property name=sex/ subclass name=Pig discriminator-value=P property name=weight/ /subclass subclass name=Bird discriminator-value=B property name=height/ /subclass /class /hibernate-mapping 总结: 每棵类继承树一张表的优点效率上要好一些,因为它只有一张表, 无论存储、 查找 还是更新都只对一张表操作, 这样的表结构我们都知道它有一个缺点就是冗余字段会多一些;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论