在Hibernate中使用判别值注释的最佳场景是什么以及何时?
当使用单表策略进行实体继承,并且希望鉴别器列的值不是实体具体类的名称时,或者当鉴别器列的类型不是STRING时。
javadoc中有一个例子对此进行了解释。
我举个例子给你解释一下。假设你有一个动物类,在动物类下面有很多子类,比如爬行动物,鸟类...等等。
在数据库中有一个名为<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 {
}
这两个链接最有助于我理解继承的概念:
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 编辑 对于那些想要非番石榴版本的人,应该使用类似以下的功能: 并要自定义错