gpt4 book ai didi

java - Hibernate 多态性 : instantiating the right class

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:19:19 26 4
gpt4 key购买 nike

我是 hibernate 的新手,您很快就会看到。如果这个问题有一个简单的答案,我深表歉意,但我对所有术语都不够熟悉,无法轻松找到答案。

假设我有一个基类“A”和一个子类“B”,我正在使用 Hibernate 进行映射,也许使用每个子类策略的表。基类不是抽象的。所有 B 都是 A,但并非所有 A 都是 B。这反射(reflect)在数据库中,其中表 B 引用表 A。

好的,现在假设我有一个显示 A 对象列表的程序。用户可以选择任何 A 对象并转到屏幕进行修改...但是,如果 A 对象也是 B,则屏幕将允许用户修改 B 而不仅仅是 A。

我到底该如何处理这个问题?

注意:我不是在问如何确定一个对象是什么类。我要问的是如何让 hibernate 返回属于正确类的对象列表。

最佳答案

我再次为这个问题道歉。我对 hibernate 的工作方式感到非常惊讶,它真的很酷。我不认为它会自动完成所有这些,我什至不确定我想问什么。当我回复评论时,我开始在脑海中细化问题,然后能够找到我正在寻找的答案。感谢所有提供帮助的人。

答案是:hibernate 会自动执行此操作。

假设您的数据库表 A 具有主键“id”,表 B 具有引用表 A 的主键“a_id”。

因此您创建了以下类(缩写):

public class A {
private String aProperty;
// ... getter and setter, etc
{

public class B extends A {
private String bProperty;
// ... getter and setter, etc
}

然后像这样映射它们:

<hibernate-mapping>
<class name="A" table="a" catalog="testokdelete">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="aProperty" column="a_property"/>
<joined-subclass name="B" table="b">
<key column="a_id"/>
<property name="bProperty" column="b_property"/>
</joined-subclass>
</class>
</hibernate-mapping>

并且您可以使用简单的“from A”查询返回 A 和 B 对象,如以下代码所示:

Query query = session.createQuery("from A");
List<Object> objects = query.list();
for (Object object: objects) {
System.out.print("A property: ");
System.out.print(((A)object).getAProperty());
System.out.print(", B property: ");
System.out.println( (object.getClass() == B.class) ? ((B)object).getBProperty() : "not a B");
}

它所做的只是使用“来自 A”的查询返回一个对象列表,然后遍历它们打印出我们 A 类的 aProperty,如果该类是类型 B,则打印出我们 B 类的 bProperty。

这种情况下的 hibernate 查询是自动多态的,并会在适当的时候给你一个 B 对象。

关于java - Hibernate 多态性 : instantiating the right class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/757812/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com