`
pengjj2
  • 浏览: 136179 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

hibernate继承之一,单表继承映射

 
阅读更多

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才可以。

 

 

分享到:
评论
1 楼 twtja1 2015-06-30  
最后一句"如果需要在父类中仍然要使用类型字段,需要在此字段的声明上加入

insert=false,update=false才可以。"楼主应该是说“如果需要在父类中仍然要使用被鉴别器占用的字段,需要而外添加该字段的属性映射,并在映射中加上insert=false,update=false才可以。”如下所示:
    <discriminator column="RTYPE" type="Int16" not-null="true"/>
    <!--如果需要在父类中使用鉴别器所占用的字段,需要添加类似下面的映射-->
    <property name="RType" column="RTYPE" insert="false" update="false"/>

相关推荐

Global site tag (gtag.js) - Google Analytics