我知道有一些关于此事的帖子,但他们大约一年没有回应。实际上我们在PostgreSQL 8.4上使用Hibernate 4.2.1.Final。我们有两个像这样的实体
实体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中的一个错误,或者我做错了什么?
祝你好运
答案 0 :(得分:5)
在我看来,相关文档和功能本身非常混乱。来自Chapter 5:
显式多态性意味着只有显式命名该类的查询才会返回类实例。
这将向我表明您的查询应该工作。但是你想要做的事情似乎并不是他们的意图,你可以在后面的同一段中看到:
当两个不同的类映射到同一个表时,显式多态性非常有用这允许包含表列子集的“轻量级”类。
他们在这里讨论的是将B
和A
映射到同一个表,但没有实际的类关系。您可以在旧JIRA ticket中重复此观点。我想这意味着,如果他们没有类关系,但是在同一个表中,那么你可以使用IMPLICIT
多态来获得两个相同的查询,但这似乎完全奇怪,因为他们不共享一个Java子类。
因此,摘要是PolymorphismType.EXPLICIT
没有按照您的想法行事。在我看来,基于上面的第一个引用,它应该应该做你期望的事情。