当前位置: 首页 > 知识库问答 >
问题:

何时在Hibernate中使用判别值注释

柳才良
2023-03-14

在Hibernate中使用判别值注释的最佳场景是什么以及何时?

共有3个答案

曾元忠
2023-03-14

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

javadoc中有一个例子对此进行了解释。

萧德庸
2023-03-14

我举个例子给你解释一下。假设你有一个动物类,在动物类下面有很多子类,比如爬行动物,鸟类...等等。

在数据库中有一个名为<code>ANIMAL</code>的表

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

在这里,类型列被称为鉴别器列,因为该列包含明确区分爬行动物和鸟类的数据。而类型列中的爬行动物鸟类数据是鉴别器值。

所以在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 {

}
金承嗣
2023-03-14

这两个链接最有助于我理解继承的概念:

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

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

要理解鉴别器,首先必须理解继承策略:单表、联接、表_ PER_。

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

例如:你有一个班级学生和两个子班级:好学生和坏学生。好学生和坏学生的数据都将存储在一个表中,但是我们当然需要知道类型,以及(DiscriminatorColumn和)DiscriminatorValue何时会出现。

为学生班级添加注释

@Entity
@Table(name ="Student")
@Inheritance(strategy=SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING,
    name = "Student_Type")
public class Student{
     private int id;
     private String name;
}

班上的坏学生

@Entity
@DiscriminatorValue("Bad Student")
public class BadStudent extends Student{ 
 //code here
}

好学生班

@Entity
@DiscriminatorValue("Good Student")
public class GoodStudent extends Student{ 
//code here
}

因此,现在 Student 表将有一个名为 Student_Type 的列,并将学生的鉴别值保存在其中。

-----------------------
id|Student_Type || Name |
--|---------------------|
1 |Good Student || Ravi |
2 |Bad Student  || Sham |
-----------------------

请参阅我在上面发布的链接。

 类似资料:
  • 问题内容: 什么和何时在hibernate状态下使用DiscriminatorValue注释的最佳方案是什么? 问题答案: 这两个链接帮助我最了解继承概念: http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html http://www.javaworld.com/javaworld/jw-01-2008/jw-01-jpa1.html?pag

  • 问题内容: 我知道SO和网络上都有很多这些问题,但是所有答案都建议使用特定于数据库的信息,因此不适用于我,因为我正在使用的系统需要在不同的数据库上运行。 我发现这个hibernate问题,有人要求使用此功能进行注释。该问题已经解决,表示另一个问题将涉及该功能。第二个问题显然添加了注释以及其他一些注释,但是我找不到有关如何使用这些新注释定义默认列值的文档。 所以我的问题是:有谁知道我该如何定义带注释

  • 我在互联网上搜索过,看到了关于在mysql中使用Hibernate注释在实体类中设置默认值的想法,我已经完成了将默认值设置为具有数据类型整数的列,如下所示。 而且工作得很好。 但是我没有看到任何varchar/string数据类型的示例,我尝试了columnDefinition中的不同类型,比如, 使用“长度”属性:- 等等。 但在这种情况下,表不是由hibernate创建的,这可能是由于语法错误

  • 问题内容: 如何在hibernate状态下使用层叠和注释? 但是我仍然怀疑: 我有这种情况: 当我尝试时,发生错误。我不想保存产品和包装。我只想初始化并将它们设置到我的包对象中。 那可能吗? 问题答案: 请参阅有关此问题的hibernate文档。例如,您可以使用例如 要么

  • 问题内容: 所以我对数据库中的某些表进行了反向工程,当我尝试将对象保存到数据库中时,出现以下错误: 初始SessionFactory创建失败。org.hibernate.AnnotationException:从com.mycode.Account引用com.mycode.Block的外键具有错误的列数。在线程“ main”中应为2异常java.lang.ExceptionInInitialize

  • 问题内容: 如何使用休眠注释来验证枚举成员字段?以下内容不起作用: 问题答案: 请注意,您还可以创建一个验证器来检查String是否为枚举的一部分。 这很好,因为您不会丢失“错误值”的信息。您会收到类似的消息 值“ someBadUserType”不是有效的用户类型。有效的UserType值是:PERSON,COMPANY 编辑 对于那些想要非番石榴版本的人,应该使用类似以下的功能: 并要自定义错