6

我知道有一些关于这个的帖子,但他们大约一年没有回应。实际上,我们使用的是 Hibernate 4.2.1.Final 而不是 PostgreSQL 8.4。我们有两个这样的实体

实体 A(顶级层次类)

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Polymorphism(type = PolymorphismType.EXPLICIT)
public class A {
    @Id
    @GeneratedValue
    private Long id;

    public A() {

    }

    public A(Long id) {
        super();
        this.id = id;
    }

    // Setters, getteres, hashCode and equals
}

实体 B(子类)

@Entity
public class B extends A{
    String value;

    public B(){

    }

    public B(String value) {
        super();
        this.value = value;
    }

    public B(Long id, String value) {
        super(id);
        this.value = value;
    }

    // Setters, getteres, hashCode and equals
}

如您所见,一个实体被注释PolymorphismType.EXPLICIT但在获取顶级类时

ArrayList<A> lista = (ArrayList<A>) session.createCriteria(A.class).list();

我们也通过该String value属性获得了 B 子类。事实上,SQL 语句包含left outer join B. 这仍然是 Hibernate 第四版中的错误还是我做错了什么?

此致

4

1 回答 1

6

在我看来,相关文档和功能本身非常混乱。从第 5 章开始:

显式多态性意味着类实例将仅由显式命名该类的查询返回。

这将向我表明您的查询应该有效。但是你试图做的似乎不是他们的意图,正如你在同一段后面看到的那样:

当两个不同的类映射到同一个表时,显式多态很有用。这允许“轻量级”类包含表列的子集。

他们在这里谈论的是拥有BA映射到同一张表,但没有实际的类关系。您可以在旧的JIRA 票证中看到这种观点重复。我想这意味着如果它们没有类关系,但在同一个表中,那么您可以使用IMPLICIT多态性来使用相同的查询来获取两者,但这似乎完全奇怪,因为它们不共享 Java 子类。

所以,总结是它PolymorphismType.EXPLICIT没有做你认为它做的事情。在我看来,根据上面的第一个报价,它应该做你所期望的。

于 2013-06-24T14:47:42.633 回答