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