前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【SSH快速进阶】——Hibernate继承映射:每个类映射一张表

【SSH快速进阶】——Hibernate继承映射:每个类映射一张表

作者头像
DannyHoo
发布2018-09-13 12:24:13
3830
发布2018-09-13 12:24:13
举报
文章被收录于专栏:Danny的专栏Danny的专栏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1337101

  上文说了每棵继承树映射一张表,本文继续描述让每个类都映射一张表的配置。

场景


  与上篇文章场景一样,如下类图

  上图中Pig类和Bird类继承Animal类,要让每个类映射一张表,就是让着三个类都分别映射一张表,但同时这三张表也跟对应的三个类似的,有继承关系,在父类对应的表中,实际上会存储所有子类对应的记录,如下表所示:

                       (表 1)

  Pig和Bird的记录都表示一个动物,因此都会在Animal对应的表中存储,而它们各自的拓展属性则存储在各自对应的表中,主键与Animal对应记录的主键各自对应。

配置


PO对象

  跟上篇文章一样,实体类没有任何变化。

  Animal.java

代码语言:javascript
复制
public class Animal {
    private int id;
    private String name;
    private boolean sex;
    //getter、setter
}

  Bird.java

代码语言:javascript
复制
public class Bird extends Animal{
    private int height;
    //getter、setter
}

  Pig.java

代码语言:javascript
复制
public class Pig extends Animal{
    private int weight;
    //getter、setter
}

映射文件

  配置映射文件时,父类还用<class>标签来定义即可;用<joined-subclass>标签定义两个子类, 标签内必须有key标签,表示子类对应表中记录的主键,这个主键与父类表中记录的主键一一对应;子类的特有属性同样用<property>定义即可。

  Extends.hbm.xml

代码语言:javascript
复制
<hibernate-mapping package="com.danny.hibernate">
    <class name="Animal">
        <id name="id">
            <generator 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>

  启动程序执行的建表语句如下,一共建立了三张表,并且两个子类对应表中的主键与父类对应表中的主键一致:

代码语言:javascript
复制
alter table t_bird drop foreign key FKCB5B05A431E44651
alter table t_pig drop foreign key FK68F874331E47ADF
drop table if exists t_animal
drop table if exists t_bird
drop table if exists t_pig
create table t_animal (id integer not null auto_increment, name varchar(255), sex bit, primary key (id))
create table t_bird (bid integer not null, height integer, primary key (bid))
create table t_pig (pid integer not null, weight integer, primary key (pid))
alter table t_bird add index FKCB5B05A431E44651 (bid), add constraint FKCB5B05A431E44651 foreign key (bid) references t_animal (id)
alter table t_pig add index FK68F874331E47ADF (pid), add constraint FK68F874331E47ADF foreign key (pid) references t_animal (id)

测试


  这种方案相对于上层实现(增删改查等操作)不变,因为对象模型并没有改变,只是关系模型改了,只需要修改映射文件即可。

  所以对对象的操作同上篇文章《【SSH快速进阶】——Hibernate继承映射:每棵继承树映射一张表》中的测试一致。

总结


  缺点:查询时需要关联表,效率差;插入时也要执行多个insert语句,适合继承程度不深的情况。

  优点:粒度较细,调理清楚,没有冗余。

  在表1中就可以看出,父类是真正意义上的“父类”,因此,如果父类是抽象类或者没有实际意义的话,可以用此方案。


【 转载请注明出处——胡玉洋《【SSH快速进阶】——Hibernate继承映射:每个类映射一张表》】

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年02月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档