何时在hibernate中使用DiscriminatorValue注释

cze*_*uya 42 java persistence hibernate jpa

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

cze*_*uya 47

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

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进入时的类型和类型.请参阅我上面发布的链接.


Job*_*ews 38

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

在数据库中,你有一个名为的表 ANIMAL

---------------------------
ID||NAME      ||TYPE     ||
---------------------------
1 ||Crocodile ||REPTILE  ||
---------------------------
2 ||Dinosaur  ||REPTILE  ||
---------------------------
3 ||Lizard    ||REPTILE  || 
---------------------------
4 ||Owl       ||BIRD     ||
---------------------------
5 ||parrot    ||BIRD     ||
---------------------------
Run Code Online (Sandbox Code Playgroud)

此列TYPE称为DiscriminatorColumn,因为此列包含明确区分爬行动物和鸟类的数据.数据REPTILEBIRDTYPE中的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;

}
Run Code Online (Sandbox Code Playgroud)

爬行类:

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

}
Run Code Online (Sandbox Code Playgroud)

鸟类:

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

}
Run Code Online (Sandbox Code Playgroud)


JB *_*zet 7

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

javadoc中用一个例子解释了这一点.