可能经常遇到这样的情况:
在数据库表中会有这样的一个字段用来区别记录的属性,如:在客户表中有一个字段表示客户级别,当这个记录为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{
}
这样就可以了。
分享到:
相关推荐
如果你使用的是注解配置,那么`discriminator value`可以通过`@DiscriminatorValue`注解来指定。 在实际项目中,你可能会遇到一些挑战,例如性能问题,因为单表继承可能导致大量冗余数据,特别是当子类很多时。不过...
<subclass name="subject.model.Teacher" discriminator-value="t"> <!-- 教师特有的属性映射 --> <subclass name="subject.model.Student" discriminator-value="s"> <!-- 学生特有的属性映射 --> ...
在Article.hbm.xml的映射配置中,通常会使用`<class>`标签定义Article类,`<subclass>`标签表示子类,同时使用`discriminator-value`属性来指定每个子类的标识值。例如,Topic类的discriminator-value可能是"TOPIC...
通常,这会涉及在Hibernate的配置文件(如`hibernate.cfg.xml`或`persistence.xml`)中定义`<class>`元素,并使用`<discriminator-value>`、`<subclass>`等标签来描述继承关系。 例如,假设我们有一个抽象类`Person...
<class name="Cat" table="CATS" discriminator-value="C"> ... <subclass name="DomesticCat" discriminator-value="D"> <!-- mapping for Dog could go here --> </hibernate-mapping> ``` ...
<subclass name="Dog" discriminator-value="DOG"> <!-- Dog类特有的属性 --> <subclass name="Cat" discriminator-value="CAT"> <!-- Cat类特有的属性 --> ``` 3. **运行时实例化**:在程序中,Hibernate...
<subclass name="Notepad" discriminator-value="n"> <!-- Notepad特有的属性映射 --> <subclass name="Desktop" discriminator-value="d"> <!-- Desktop特有的属性映射 --> </hibernate-mapping> ``` ##...
<subclass name="com.example.Student" discriminator-value="S"> <!-- 学生特有的属性映射 --> <subclass name="com.example.Teacher" discriminator-value="T"> <!-- 教师特有的属性映射 --> </hibernate-...
@hibernate.joined-subclass(discriminator-value="dog") public class Dog extends Animal { // ... } ``` ##### 1.6 @hibernate.joined-subclass-key (0..1) **功能描述**:定义joined子类继承策略中的外键关联...
对于`Bird`,我们设置`discriminator-value="B"`,对于`Pig`,设置`discriminator-value="P"`。 下面继续映射文件的示例: ```xml <subclass name="com.src.hibernate.Bird" discriminator-value="B"> ...
10. `discriminator-value`:在多态映射中,用于区分不同子类的值,可以是null或非null。 11. `mutable`:默认为`true`,表示类的实例是可变的。如果设置为`false`,则对象被视为不可变,这会影响Hibernate的行为。...
<subclass name="Customer" discriminator-value="CUSTOMER"/> <subclass name="Employee" discriminator-value="EMPLOYEE"/> ``` ### 结论 在选择多态映射策略时,需要根据实际的应用场景和需求来决定。每个类...
比如,对于单表继承,`<subclass>`元素需要指定discriminator-value,表明该子类的标识。对于联合继承,需要配置子类表与基类表之间的外键关系。 七、总结 理解并掌握Hibernate的继承映射是提高开发效率的关键步骤...
例如,`<class>`元素中的`discriminator-value`用来指定子类的标识。 2. **表-per-class(Table per Class Inheritance)**:每个类对应一个单独的表,子类重复父类的属性。这种方式避免了单表继承中的数据冗余,但...
6. **discriminator-value**: 指定区分不同子类的值,在多态映射中使用。 7. **where**: 指定查询时的额外条件。 例如: ```xml <where>student_status = '0' ``` #### 三、id标签 `id` 标签用于定义 Java 类...
<subclass name="Student" discriminator-value="student"> <subclass name="Teacher" discriminator-value="teacher"> ``` - **数据操作**: - 插入数据时,仍然通过`session.save()`方法保存`...
- **discriminator-value**: 用于单表继承模式下的类区分。 - **mutable**: 表示类是否可变,默认为`true`,意味着实体在事务中可以被修改。 - **schema**: 类似于`hibernate-mapping`节点的`schema`属性,定义表...
- **`discriminator-value`**:用于多态映射时区分不同子类的值。 - **`mutable`**:指定是否允许修改对象的状态,默认为`true`。 - **`schema`**:指定数据库模式或模式名称。 - **`catalog`**:指定数据库目录。 -...