`
pengjj2
  • 浏览: 138456 次
  • 性别: 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"/>

相关推荐

    Hibernate继承映射代码

    本主题将深入探讨"Hibernate继承映射+C3P0代码"的相关知识点。 首先,让我们理解Hibernate的继承映射。在Java中,我们可以创建一个基类,然后派生出多个子类,这种设计模式在数据库中也可以被映射出来。Hibernate...

    Hibernate继承映射的第一种策略:每棵类继承树对应一张表

    Hibernate继承映射是将Java类的继承关系映射到数据库表的一种策略,使得对象模型的复杂性能够平滑地转化为关系数据库模型。本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承...

    用Hibernate映射继承关系

    使用单表映射,你仍然可以像处理普通对象一样操纵`Employee`对象,Hibernate会在后台处理所有必要的类型转换和存储。 #### 14.3 继承关系树的每个类对应一个表 第三种映射方式是**类表映射**(Class-Table ...

    hibernate继承映射.rar

    本教程以“Hibernate-lab2”为例,将深入探讨Hibernate中的继承映射,为初学者提供一个清晰的学习路径。 一、Hibernate继承映射概述 Hibernate继承映射是将Java中的继承关系映射到数据库的关系模型中。在Java中,...

    Hibernate继承关系映射.pdf

    本文档主要聚焦于Hibernate框架下继承关系的映射,通过三种不同的策略——隐式继承映射、单表映射和关联表映射,来实现类的继承结构在数据库中的映射。 ### 隐式继承映射 #### 定义与配置 隐式继承映射也称为“表...

    Hibernate继承映射二:每个子类一张表

    这种方式也被称为单表继承或多表继承,是Hibernate支持的四种继承映射策略之一。了解并熟练掌握这种映射模式对于提升Java开发效率和代码维护性至关重要。 在传统的面向对象编程中,类可以有继承关系,但在关系...

    Hibernate继承映射

    Hibernate的继承映射 --每个继承层次一张表 -- 每个具体类一张表 -- 每个类一张表

    Hibernate继承映射(annotation)

    综上所述,Hibernate的单表继承映射是实现对象模型与数据库模型映射的一种有效方法。它简化了数据库设计,但需要根据具体项目需求权衡利弊,选择合适的继承策略。在实际开发中,开发者应根据业务场景和性能需求,...

    Hibernate继承映射-概述

    本篇文章将深入探讨Hibernate中的继承映射机制,帮助开发者更好地理解和运用这一强大的功能。 继承是面向对象编程中的核心概念,它允许类之间共享属性和行为。在数据库设计中,有时也需要用到类似的概念,例如,...

    hibernate 映射继承 demo

    总结:本文详细介绍了Hibernate的两种主要继承映射策略——单表继承和联合继承,并通过一个具体的Java代码示例展示了如何在项目中实现它们。理解并灵活运用这些策略,可以帮助我们更高效地处理对象关系映射,提升...

    Hibernate教程17_继承映射

    在Hibernate中,继承映射主要有三种策略:单表继承(Single Table Inheritance)、联合继承( Joined Table Inheritance)和表格-per-类继承(Table per Concrete Class)。本教程可能主要关注的是单表继承,这也是...

    hibernate映射继承关系(每个类都对应一张表)

    总结起来,"每个类都对应一张表"的继承映射策略在Hibernate中是一种直接且易于理解的方法,适合那些每个类都有独特属性的情况。然而,它可能不适合所有场景,特别是当子类众多或者需要减少数据冗余时。在实际应用中...

    Hibernate继承映射的第一种策略:每个具体类一张表

    - 如果父类有多个子类,且子类间有共享的属性,会导致数据冗余,可能需要考虑其他继承映射策略,如“单表继承”或“联合继承”。 6. **源码与工具** 提供的压缩文件`hibernate_ext_3`可能包含了对Hibernate 3.x...

    Hibernate继承映射一:每个类分层结构一张表

    这种映射策略是Hibernate提供的多种继承映射方案之一,适用于处理复杂的对象模型。 首先,我们要理解什么是继承映射。在面向对象编程中,类可以继承自其他类,形成类的继承树。在数据库中,如果要存储这些继承关系...

    14 继承(一)(整个继承树映射到一张表)

    综上所述,"14 继承(一)(整个继承树映射到一张表)"这一主题涉及的是在Hibernate中如何处理类继承关系的一种常见策略——单表继承。理解并熟练掌握这种策略对于使用Hibernate进行数据库操作的开发者来说至关重要,...

Global site tag (gtag.js) - Google Analytics