Hibernate 4显式多态(注释)不起作用?

时间:2013-01-28 21:32:20

标签: hibernate annotations polymorphism hibernate-4.x

我遇到了hibernate的显式多态性问题。我使用了多态性注释并将其设置为显式,但是在映射类中使用get()和集合我总是得到所有子类。我在hibernate“show_sql”输出中看到所有带左连接的子类。 有什么问题?我是否理解文档错误?或者它是hibernate 4中的一个错误?我还没有看到任何关于hibernate 4和多态注释的例子。

sessionFactory.getCurrentSession().get(Node.class, 111); // return subclasses!


@Entity
@Table(name="Nodes")
@Inheritance(strategy = InheritanceType.JOINED)
@Polymorphism(type= PolymorphismType.EXPLICIT)
public class Node implements Serializable {
    ...
}



@Entity
@Table(name="Persons")
public class Person extends Node {
}


@Entity
@Table(name="Networks")
public class Network extends Node {
}

...and other subclasses...

2 个答案:

答案 0 :(得分:4)

这是一个常见的错误理解,我也有过同样的怀疑......

这是显式多态性中真正发生的事情。

  
    

polymorphism explicit仅适用于根实体并阻止     命名(未映射的)超类以返回映射的子实体

  
     

在您的情况下,如果未映射实体类节点人员为   如果显式多态,则节点不会返回人员   元素

看看这段代码..

@Entity
@Table(name="Nodes")
@Inheritance(strategy = InheritanceType.JOINED)
public class Node implements Serializable {
    ...
}



@Entity
@Polymorphism(type= PolymorphismType.EXPLICIT)
@Table(name="Persons")
public class Person extends Node {
}


@Entity
@Polymorphism(type= PolymorphismType.EXPLICIT)
@Table(name="Networks")
public class Network extends Node {
}

它基本上与每个人心中的相反。!!

答案 1 :(得分:1)

如果你看一下PolymorphismType.EXPLICIT的定义,就说:

  

EXPLICIT:仅在明确询问时才检索此实体。

要隐藏子类,您必须使用EXPLICIT注释子类,而不是基类。