休眠多态性.显式注释不起作用?



我知道有一些关于这方面的帖子,但大约一年了,没有回应。实际上,我们使用的是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();

我们也得到了具有CCD_ 2属性的B子类。事实上,SQL语句包含left outer join B。这仍然是Hibernate第四版本中的一个错误,还是我做错了什么?

向致以最良好的问候

在我看来,相关文档和功能本身非常令人困惑。来自第5章:

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

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

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

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

因此,总结是PolymorphismType.EXPLICIT并没有做你认为它会做的事情。在我看来,根据上面的第一句话,它应该做你期望的事情。

相关内容

  • 没有找到相关文章

最新更新