Hibernate多态:实例化正确的类

Bod*_*den 7 java orm hibernate

我很快就会看到,我很快就会看到它.如果这个问题有一个简单的答案我很抱歉,但我对所有的术语都不太熟悉,很容易找到它.

假设我有一个基类"A"和一个子类"B",我用Hibernate映射,也许使用每个子类策略的表.基类不是抽象的.所有的B都是As,但不是所有的B都是.这反映在数据库中,表B引用表A.

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

我如何处理这个世界?

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

Bod*_*den 6

我再次为这个问题道歉.我对hibernate的工作原理感到非常惊讶,这真的很酷.我不认为它会自动完成所有这些,我甚至不确定我想要问的是什么.当我回复评论时,我开始在脑海中改进这个问题,然后能够找到我想要的答案.感谢所有帮助过的人.

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

假设您的数据库表A中有一个主键"id",另一个表B有一个名为"a_id"的主键,它引用了表A.

所以你创建了以下类(缩写):

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

public class B extends A {
  private String bProperty;
  // ... getter and setter, etc
}
Run Code Online (Sandbox Code Playgroud)

然后像这样映射它们:

<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>
Run Code Online (Sandbox Code Playgroud)

您可以使用简单的"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");
}
Run Code Online (Sandbox Code Playgroud)

它只是使用查询"从A"返回一个对象列表,然后遍历它们从我们的A类打印出aProperty,如果类是B类,则从我们的B类打印出bProperty.

在这种情况下,hibernate查询是自动多态的,并在适当时为您提供B对象.