Hibernate Polymorphism.EXPLICIT注释不起作用?
我知道有一些关于此的帖子,但是它们大约一年了,没有任何回应。实际上,我们在PostgreSQL 8.4上使用的是Hibernate
4.2.1.Final。我们有两个这样的实体
@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
}
@Entitypublic 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第四版中的错误,还是我做错了什么?
最好的祝福
回答:
我认为相关文档和功能本身非常令人困惑。从第5章开始:
显式多态性意味着类实例将仅由显式命名该类的查询返回。
这将向我表明您的查询 应该 有效。但是,您尝试做的事情似乎并不是他们的意图,正如您在同一段的后面可以看到的那样:
当两个不同的类映射到同一张表时,显式多态性很有用。这允许包含表列子集的“轻量级”类。
他们在这里谈论的是具有B
并A
映射到同一张表,但没有实际的类关系。您可以在JIRA的旧机票中看到这种观点。我猜这意味着,如果它们没有类关系,但是在同一个表中,则可以使用IMPLICIT
多态性通过相同的查询来获取两者,但是鉴于它们不共享Java子类,这似乎完全是奇怪的。
因此,总结是,PolymorphismType.EXPLICIT
它并没有实现您认为的那样。我认为,根据上面的第一个引用,它 应该 可以满足您的期望。
以上是 Hibernate Polymorphism.EXPLICIT注释不起作用? 的全部内容, 来源链接: utcz.com/qa/397882.html