我再次为这个问题道歉。我对hibernate的工作方式感到非常惊讶,它真的很酷。我不认为它会自动完成所有这些,我什至不确定我想问什么。当我回复 cmets 时,我开始在脑海中细化这个问题,然后能够找到我正在寻找的答案。感谢所有提供帮助的人。
答案是:hibernate 会自动执行此操作。
假设您的数据库中有一个主键“id”的表 A,以及一个引用表 A 的主键“a_id”的表 B。
所以你创建了以下类(缩写):
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>
您可以使用简单的“来自 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。
这种情况下的休眠查询是自动多态的,并会在适当的时候给你一个 B 对象。