在hibernate中使用DiscriminatorValue注释的最佳方案是什么以及何时?
答案 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
列中的数据BIRD
和TYPE
是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会抛出异常