我知道有一些关于这方面的帖子,但他们大约有一年,没有回应。实际上,我们使用的是Hibernate 4.2.1,在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的第四个版本中的一个bug,还是我做错了什么?
诚挚的问候
发布于 2013-06-24 14:47:42
在我看来,相关的文档和特性本身是非常令人困惑的。来自第五章
显式多态意味着类实例只能通过显式命名该类的查询返回。
这将向我表明你的查询应该有效。但你试图做的似乎不是他们的意图,正如你在同一段后面所看到的那样:
当两个不同的类映射到同一个表时,显式多态性非常有用,这允许一个包含表列子集的“轻量级”类。
他们在这里谈论的是让B和A映射到同一个表,但是没有实际的类关系。您可以在旧的JIRA机票中看到这种观点的重复。我猜这意味着,如果他们没有类关系,但在同一个表中,那么您可以使用IMPLICIT多态性来获得这两个查询,但这似乎完全奇怪,因为他们没有共享一个Java子类。
因此,总结是PolymorphismType.EXPLICIT没有做您认为它所做的事情。在我看来,它应该做你期望的事情,根据上面的第一条报价。
https://stackoverflow.com/questions/17277500
复制相似问题