`

discriminator-value

 
阅读更多

可能经常遇到这样的情况:
      
在数据库表中会有这样的一个字段用来区别记录的属性,如:在客户表中有一个字段表示客户级别,当这个记录为A时是一级客户,为B时是二级客户。在用hiberanteOR表示时类可能是这样的:
       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字段的值了,会自动的加AB


如果是使用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{
}

这样就可以了。

分享到:
评论

相关推荐

    hibernate Table per class hierarchy 例子代码

    如果你使用的是注解配置,那么`discriminator value`可以通过`@DiscriminatorValue`注解来指定。 在实际项目中,你可能会遇到一些挑战,例如性能问题,因为单表继承可能导致大量冗余数据,特别是当子类很多时。不过...

    Spring+Hibernate+Acegi 的初次体验

    &lt;subclass name="subject.model.Teacher" discriminator-value="t"&gt; &lt;!-- 教师特有的属性映射 --&gt; &lt;subclass name="subject.model.Student" discriminator-value="s"&gt; &lt;!-- 学生特有的属性映射 --&gt; ...

    Hibernate继承类的实现.docx

    在Article.hbm.xml的映射配置中,通常会使用`&lt;class&gt;`标签定义Article类,`&lt;subclass&gt;`标签表示子类,同时使用`discriminator-value`属性来指定每个子类的标识值。例如,Topic类的discriminator-value可能是"TOPIC...

    17 继承(四)每一个具体的类 映射到一张表

    通常,这会涉及在Hibernate的配置文件(如`hibernate.cfg.xml`或`persistence.xml`)中定义`&lt;class&gt;`元素,并使用`&lt;discriminator-value&gt;`、`&lt;subclass&gt;`等标签来描述继承关系。 例如,假设我们有一个抽象类`Person...

    ORMapping基础.pdf

    &lt;class name="Cat" table="CATS" discriminator-value="C"&gt; ... &lt;subclass name="DomesticCat" discriminator-value="D"&gt; &lt;!-- mapping for Dog could go here --&gt; &lt;/hibernate-mapping&gt; ``` ...

    Hibernate教程17_继承映射

    &lt;subclass name="Dog" discriminator-value="DOG"&gt; &lt;!-- Dog类特有的属性 --&gt; &lt;subclass name="Cat" discriminator-value="CAT"&gt; &lt;!-- Cat类特有的属性 --&gt; ``` 3. **运行时实例化**:在程序中,Hibernate...

    Hibernate继承关系映射.pdf

    &lt;subclass name="Notepad" discriminator-value="n"&gt; &lt;!-- Notepad特有的属性映射 --&gt; &lt;subclass name="Desktop" discriminator-value="d"&gt; &lt;!-- Desktop特有的属性映射 --&gt; &lt;/hibernate-mapping&gt; ``` ##...

    hibernate 映射继承 demo

    &lt;subclass name="com.example.Student" discriminator-value="S"&gt; &lt;!-- 学生特有的属性映射 --&gt; &lt;subclass name="com.example.Teacher" discriminator-value="T"&gt; &lt;!-- 教师特有的属性映射 --&gt; &lt;/hibernate-...

    @hibernate Tag Reference

    @hibernate.joined-subclass(discriminator-value="dog") public class Dog extends Animal { // ... } ``` ##### 1.6 @hibernate.joined-subclass-key (0..1) **功能描述**:定义joined子类继承策略中的外键关联...

    Java的Hibernate框架中的继承映射学习教程

    对于`Bird`,我们设置`discriminator-value="B"`,对于`Pig`,设置`discriminator-value="P"`。 下面继续映射文件的示例: ```xml &lt;subclass name="com.src.hibernate.Bird" discriminator-value="B"&gt; ...

    hibernate-mapping参数详解

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

    hibernate 学习笔记4

    &lt;subclass name="Customer" discriminator-value="CUSTOMER"/&gt; &lt;subclass name="Employee" discriminator-value="EMPLOYEE"/&gt; ``` ### 结论 在选择多态映射策略时,需要根据实际的应用场景和需求来决定。每个类...

    hibernate继承映射.rar

    比如,对于单表继承,`&lt;subclass&gt;`元素需要指定discriminator-value,表明该子类的标识。对于联合继承,需要配置子类表与基类表之间的外键关系。 七、总结 理解并掌握Hibernate的继承映射是提高开发效率的关键步骤...

    hibernate_问题详解

    例如,`&lt;class&gt;`元素中的`discriminator-value`用来指定子类的标识。 2. **表-per-class(Table per Class Inheritance)**:每个类对应一个单独的表,子类重复父类的属性。这种方式避免了单表继承中的数据冗余,但...

    hbm.xml说明

    6. **discriminator-value**: 指定区分不同子类的值,在多态映射中使用。 7. **where**: 指定查询时的额外条件。 例如: ```xml &lt;where&gt;student_status = '0' ``` #### 三、id标签 `id` 标签用于定义 Java 类...

    继承关系映射和HibernateQBC查询

    &lt;subclass name="Student" discriminator-value="student"&gt; &lt;subclass name="Teacher" discriminator-value="teacher"&gt; ``` - **数据操作**: - 插入数据时,仍然通过`session.save()`方法保存`...

    常用 Hibernate 映射配置说明.doc

    - **discriminator-value**: 用于单表继承模式下的类区分。 - **mutable**: 表示类是否可变,默认为`true`,意味着实体在事务中可以被修改。 - **schema**: 类似于`hibernate-mapping`节点的`schema`属性,定义表...

    hibernate关联映射的作用和常用属性解释

    - **`discriminator-value`**:用于多态映射时区分不同子类的值。 - **`mutable`**:指定是否允许修改对象的状态,默认为`true`。 - **`schema`**:指定数据库模式或模式名称。 - **`catalog`**:指定数据库目录。 -...

Global site tag (gtag.js) - Google Analytics