java - Hibernate 多态性 : instantiating the right class

标签 java hibernate orm

我是 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/

相关文章:

java - 三元运算符(Java)

java - 列 'id' 的列说明符不正确

java - Spring Hibernate validator 不工作但 javax 是

java - 用于 Java 的 NHibernate MultiQuery

java - hibernate 设计: persistent data plus temporary run-time classes

java - 如何从不同的 Activity 检索 boolean 值?

java - 我想将Java中的字节数据转换为C

java - super 构造函数无法按我认为的方式工作

java - @AttributeOverride 不适用于 Hibernate 5

php - 反向外键 Doctrine