`

Hibernate的Discriminator应用

阅读更多
Hibernate的Discriminator应用
可能经常遇到这样的情况:
       在数据库表中会有这样的一个字段用来区别记录的属性,如:在客户表中有一个字段表示客户级别,当这个记录为A时是一级客户,为B时是二级客户。在用hiberante做OR表示时类可能是这样的:
       public class Customer{
          private String flag;   //表示客户的级别
          ...
       }   
       然后,在程序中手动控制flag的值,但是这样当每个级的客户有不同的属性时Customer类将包含所有级别的属性,这样不是很好。
       hibernate提供一个Discriminator映射的方法,就是把一个表映射成不同的类,有不同的属性。

       public class Customer{
          //包含所有级别的公共属性
          ...
        }
      
       public class CustomerA extends Customer{
       //只包括一级客户的特有属性
        }

       public class CustomerB extends Customer{
       //只包含二级客户特有的属性
        }
这样更符合面向对象的原则,然后在hbm.xml中这样写:
<id name="id" type="int">
    ...
</id>
<discriminator column="flag" type="string" />
<!-- 公共属性的映射 -->
<subclass name="CustomerA" discriminator-value="A">
<!-- 一级客户特有属性的映射 -->
</subclass>
<subclass name="CustomerB" discriminator-value="B">
<!-- 二级客户特有属性的映射 -->
</subclass>

这样就可以单独的用CustomerA,CustomerB这样的实例了,做数据库修改时就不用关心flag字段的值了,会自动的加A或B。

如果是使用hibernate Annotation而不是xml来描述映谢关系,代码如下:
@Entity
@Table(name = "customer")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "flag", discriminatorType = DiscriminatorType.STRING)
public class Customer{
}

@Entity
@DiscriminatorValue(value = "A")
public class CustomerA extends Customer{
}

@Entity
@DiscriminatorValue(value = "B")
public class CustomerB extends Customer{
}

这样就可以了。
-------------------------------
<?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 package="com.bjsxt.hibernate">
<class name="Animal" table="t_animal" lazy="false">
<id name="id">
<generator class="native"/>
</id>
<!-- 鉴别器,而且必需放到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>

<!-- 也可以这样定义继承映射
<subclass name="Pig" extends="Animal">
<property name="weight" type="int"/>
</subclass>
-->
</hibernate-mapping>
分享到:
评论

相关推荐

    Hibernate Annotation应用

    《Hibernate Annotation应用详解》 在Java企业级开发中,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而Hibernate Annotation是Hibernate框架的一部分,它允许开发者使用注解来配置...

    hibernate Table per class hierarchy 例子代码

    此外,Hibernate还会添加一个`discriminator column`,默认是`discriminator_value`,用来标识每条记录的实际类型。 配置Hibernate映射文件(如果是XML配置)时,需要设置`&lt;class&gt;`元素的`discriminator-value`属性...

    Hibernate-3.2源码包

    10. **多态性支持**:Hibernate 支持多态性映射,这意味着父类和子类可以共享同一个数据库表,通过 discriminator 字段区分不同类型的实例。 深入研究 Hibernate-3.2 的源码,可以帮助我们理解其内部工作原理,更好...

    Hibernate继承映射代码

    1. 单表继承:所有子类的数据都存储在一个表中,通常通过一个特定的字段(例如,discriminator column)来区分不同的子类。这是最节省空间但可能导致查询复杂化的策略。 2. 联合继承:每个子类都有自己的表,基类中...

    @hibernate Tag Reference

    在进行Hibernate项目的开发过程中,开发者经常会遇到对Hibernate描述符文件中各种注解(Tag)的应用需求。本文档旨在提供一个全面的@hibernate Tag参考指南,帮助开发人员更好地理解和使用这些标签。 #### 一、@...

    hibernate-mapping参数详解

    10. `discriminator-value`:在多态映射中,用于区分不同子类的值,可以是null或非null。 11. `mutable`:默认为`true`,表示类的实例是可变的。如果设置为`false`,则对象被视为不可变,这会影响Hibernate的行为。...

    Hibernate3.5官方开发文档pdf + html

    这些知识点覆盖了Hibernate 3.5的核心功能,开发者可以通过官方文档深入学习和掌握,从而有效地在实际项目中应用Hibernate。无论是初学者还是有经验的开发者,这份文档都是理解和使用Hibernate不可或缺的资源。

    hibernate annotaion api 中文与英文版

    理解并熟练应用Hibernate Annotation API需要通过阅读官方文档、参考书籍以及实际项目开发来积累经验。可以尝试创建简单的CRUD操作,逐步学习和掌握各种注解的用法。 总结,Hibernate Annotation API使得ORM配置...

    hibernate annotation 中文文档

    以上仅是Hibernate Annotation部分核心概念的简述,实际使用中还需要根据项目需求和最佳实践来灵活应用。深入理解和熟练掌握这些注解,能极大地提升开发效率并优化数据库操作。阅读《Hibernate Annotation 中文文档...

    Hibernate注解jar包

    Hibernate是Java领域中一款广泛应用的关系对象映射框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据库。在Hibernate 3.2版本之后,引入了注解支持,极大地减少了XML配置文件的需求,使得代码...

    Hibernate+中文文档

    1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. ...

    hibernate-mapping

    《Hibernate Mapping:深入理解与应用》 Hibernate Mapping是Java领域中一种重要的对象关系映射(ORM)技术,它使得开发者可以使用面向对象的方式来操作数据库,极大地简化了数据存取的操作。在Hibernate中,...

    用Hibernate映射继承关系

    一个额外的字段,通常叫做`discriminator_column`,用来区分不同类的实例。优点是数据冗余少,但可能导致列数量较多,且查询时可能需要额外的类型判断。 2. **联合表继承(Joined Table Inheritance)** 每个子类...

Global site tag (gtag.js) - Google Analytics