hibernate继承之一,单表继承映射
对象有继承,而对于数据结构来说,如何在映射中体现这种关系。借助hibernate,我们在对表的映射中能够体现这种关系和设计。
相信我们在设计表的时候经常有这种情况,会用一个type字段来表示这张表的两种形式。而反映到java对象中,其实应该是两个对象,不过有很多相同的共同属性。但实际一般来说都会只用一个类,在查询是用type指定值来分辨。
hibernate提供了一种继承的映射来实现这种对象的继承关系。
以合同表举例,比如我分为A类合同和B类合同,逻辑处理并不一样,但数据结构基本是相同的,可能只有1-2个字段不相同,这种情况可以使用hibernate三种继承中的一种,个人觉得这种的使用情况会比较多。因为这种情况不会涉及到多表联查。
设计三个类,合同,A类合同,B类合同。type字段进行区分,0为A,1为B。type用int类型还是用string类型,在hbm文件中区别。hbm文件如下
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class
name="合同类"
table="TB_CONTRACT"
discriminator-value="not null"
<!--如果区别字段是整数类型,则需要声明辨别值不为NULL,如果是string类型,则不必加入这句-->
>
<id
name="id"
type="long"
column="ID"
>
<generator class="native" />
</id>
<!-- 用该字段作为辨别,用元素discriminator-->
<discriminator column="CONTRACT_TYPE" type="int" ></discriminator>
<property
name="contractName"
type="java.lang.String"
column="CONTRACT_NAME"
/>
<property
name="levelLink"
type="java.lang.String"
column="LEVEL_LINK"
/>
<property
name="code"
type="java.lang.String"
column="CODE"
not-null="true"
unique="true"
/>
<!-- bi-directional one-to-many association to LkPmContractItem -->
<set
name="lkPmContractItems"
lazy="true"
inverse="true"
cascade="none"
>
<key>
<column name="CONTRACT_ID_FK" />
</key>
<one-to-many
class="com.qeweb.lonking.pm.contract.bo.PmContractItemBO"
/>
</set>
<!-- 最后用subclass声明子类,discriminator-value属性指定对应的值 -->
<subclass name="A合同类名" discriminator-value="0">
</subclass>
<subclass name="B合同类名" discriminator-value="1">
</subclass>
</class>
</hibernate-mapping>
至此,Hibernate关于单表映射成继承关系就完成了。
另外,如果你对于子类有分别需要映射的字段,那么需要在<subclass></subclass>中添加。
关键字:discriminator-value,discriminator,subclass
如果需要在父类中仍然要使用类型字段,需要在此字段的声明上加入
insert=false,update=false才可以。

本文详细介绍了如何在Hibernate中通过单表映射实现对象的继承关系,以合同表为例,展示了如何设计类、映射文件及字段,包括type字段用于区分不同类型的合同,并说明了子类映射字段的添加方式。
1859

被折叠的 条评论
为什么被折叠?



