Java和Hibernate继承-更新时进行类型转换

use*_*mda 7 java inheritance constructor hibernate

我的课堂上有以下层次结构

@Entity
@Table(name = "Parent")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Parent {
}

@Entity
@DiscriminatorVlaue("FirstChild")
public class FirstChild extends Parent {
}

@Entity
@DiscriminatorVlaue("SecondChild")
public class SecondChild extends Parent {
}
Run Code Online (Sandbox Code Playgroud)

这将按预期创建表Parent。

我的应用程序中的一些业务逻辑:

接受请求后,该请求将保留为“父代”类型,并在表中创建以下条目

Dtype    id  value
Parent   1   "some value"
Run Code Online (Sandbox Code Playgroud)

在处理请求时,它可以是类型,也可以是类型FirstChildSecondChild 因此在我的代码中

if (some condition is met) {
// change the Parent to its firstChild type
}
else {
// chnage it to "SecondChild" type
}
Run Code Online (Sandbox Code Playgroud)

我对继承的理解和用法正确吗?我本质上是在抛出运行时异常的if循环中向下转换对象,但是更改对象的类型是否还会更改DTYPE数据库中的值?我本质上是在使用继承来使事物按其类型进行组织。我可以在构造函数中实现这一功能吗?但是,真正的问题是Dtype更新是否可以修改?

为了进一步解决这个问题,

我在子类中创建了constutructors

public FirstChild(Parent parent) {
id = parent.id
}
Run Code Online (Sandbox Code Playgroud)

但这会为子类型创建新行,

  Dtype       id  value
  Parent      1   "some value"
  FirstChild  2   "some value"
Run Code Online (Sandbox Code Playgroud)

我确保使用父ID(1)创建“ firstChild”记录,但是我不确定为什么要创建第二行

Bur*_*dız 3

关系数据库中不存在真正的继承。Hibernate只是模拟它。继承是一种像所有者一样使用其他类的编程概念。但是你不能使用其他表作为拥有表。在子表中,如果你有一个元素而不是有一个父元素,但父元素在哪里?父级也是一个元素..(一行数据)。所以你在数据库中模拟它。Hibernate 有一些继承策略。“SINGLE_TABLE”就是其中之一,它将父表和子表收集在 1 个表中。为了区分哪个类型是哪个类,请在数据库上使用“DiscriminatorColumn”。此列无法更改,它是静态的并使用您的 java 类进行声明。您可以使用“DiscriminatorValue”选择一个值来标识“DiscriminatorColumn”处的 java 类。所以你对关系数据库的继承理解是不同的。您必须在父表行上声明每个子行数据...