我知道有一些关于此的帖子,但大约一年了,没有任何回应。实际上我们使用的是 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();
我们也得到了 B 子类String value
财产。事实上,SQL语句包含left outer join B
。这仍然是 Hibernate 第四版中的错误还是我做错了什么?
此致
在我看来,相关文档和功能本身非常混乱。从第5章 http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html/ch05.html:
显式多态性意味着类实例将仅由显式命名该类的查询返回。
这向我表明你的查询should工作。但你试图做的事情似乎并不是他们的意图,正如你在同一段后面所看到的:
当两个不同的类映射到同一个表时,显式多态性非常有用。这允许“轻量级”类包含表列的子集。
他们在这里谈论的是B
and A
映射到同一个表,但没有实际的类关系。你可以在旧的文章中看到这个观点的重复吉拉门票 https://hibernate.atlassian.net/browse/ANN-314?jql=text%20~%20%22polymorphismtype%22。我想这意味着如果它们没有类关系,但位于同一个表中,那么您可以使用IMPLICIT
多态性可以通过相同的查询获得两者,但这似乎很奇怪,因为它们不共享 Java 子类。
所以,总结就是PolymorphismType.EXPLICIT
并没有按照你的想法去做。在我看来,它should根据上面的第一句话,做你所期望的事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)