何时在hibernate中使用DiscriminatorValue注释

时间:2013-05-27 11:38:00

标签: java hibernate jpa persistence

在hibernate中使用DiscriminatorValue注释的最佳方案是什么以及何时?

4 个答案:

答案 0 :(得分:46)

这两个链接帮助我最了解继承概念:

http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

http://www.javaworld.com/javaworld/jw-01-2008/jw-01-jpa1.html?page=6

要理解鉴别器,首先必须了解继承策略:SINGLE_TABLE,JOINED,TABLE_PER_CLASS。

Discriminator通常用于SINGLE_TABLE继承,因为您需要一列来标识记录的类型。

示例:您有一个Student类和2个子类:GoodStudent和BadStudent。 Good和BadStudent数据都将存储在1个表中,但当然我们需要知道DiscriminatorColumn进入时的类型和类型。请参阅我上面发布的链接。

答案 1 :(得分:25)

让我用一个例子来解释你。假设您有一个名为Animal的类,而在Animal类下有许多子类,如Reptile,Bird ......等。

在数据库中,您有一个名为ANIMAL

的表
---------------------------
ID||NAME      ||TYPE     ||
---------------------------
1 ||Crocodile ||REPTILE  ||
---------------------------
2 ||Dinosaur  ||REPTILE  ||
---------------------------
3 ||Lizard    ||REPTILE  || 
---------------------------
4 ||Owl       ||BIRD     ||
---------------------------
5 ||parrot    ||BIRD     ||
---------------------------

此处列TYPE称为DiscriminatorColumn,因为此列包含明确区分爬行动物和鸟类的数据。 REPTILE列中的数据BIRDTYPE是DiscriminatorValue。

所以在java部分中,这个结构看起来像:

动物类:

@Getter
@Setter
@Table(name = "ANIMAL")
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "TYPE")
public class Animal {

    @Id
    @Column(name = "ID")
    private String id;

    @Column(name = "NAME")
    private String name;

}

爬行类:

@Entity
@DiscriminatorValue("REPTILE")
public class Reptile extends Animal {

}

鸟类:

@Entity
@DiscriminatorValue("BIRD")
public class Bird extends Animal {

}

答案 2 :(得分:7)

当您使用单表策略实现实体继承时,并且您希望discriminator列的值不是实体具体类的类的名称,或者当鉴别器列的类型不是STRING。

通过the javadoc中的示例解释了这一点。

答案 3 :(得分:0)

以下是关于每个类层次结构的hibernate表的解释和一个示例,考虑我们有基类名为Payment和2个派生类,如CreditCard,Check

如果我们保存派生类对象如CreditCard或Check那么自动Payment类对象也将被保存到数据库中,并且在数据库中所有数据都将被存储到单个表中,这是基类表肯定

但是在这里我们必须在数据库中使用一个额外的鉴别器列,只是为了识别哪个派生类对象与基类对象一起保存在表中,如果我们不使用这个列,hibernate会抛出异常