hibernate学习之继承映射

我们可以将继承层次结构类与数据库的表映射。 在hibernate中定义了三个继承映射策略:

什么情况用?

子类教多,且子类较为简单,即只有个别属性!

方式一:整个的继承

体系就用一张表、数据库:t_animal (要存储所有的子类信息)

Id name sexweight heighttype_(“鉴别器”区别是哪个子类)

<hibernate-mapping package="com.hyxd.entity">  
<class 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>  

好处:因为使用一个映射文件, 减少了映射文件的个数。

缺点:(不符合数据库设计原则)一个映射文件: Animal.hbm.xml(如何区分是哪个子类的信息?)

总结:

写法较为简单:所有子类用一个映射文件,且映射到一张表!但数据库设计不合理!(不推荐用。)


方式二:每个子类一张表,存放子类所特有的属性

<hibernate-mapping package="com.hyxd.entity">  
<class name="Animal" table="t_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> 

总结:

一个映射文件,存储所有的子类; 子类父类都对应表;

缺点:表结构比较负责,插入一条子类信息,需要用2条sql: 往父类插入、往子类插入!


方式三:每个具体类一张表(union-subclass) ,保存是子类完整信息


<hibernate-mapping package="com.hyxd.entity">  
<class name="Animal" table="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-mapping>  

总结:

所有的子类都写到一个映射文件;

父类不对应表; 每个子类对应一张表

注意:在保存对象的时候id不能重复(不能使用数据库的自增方式生成主键)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值