8

我面临着休眠的显式多态性问题。我使用了多态注释并将其设置为显式,但是使用映射类中的 get() 和集合,我总是得到所有子类。我在休眠“show_sql”输出中看到了所有带有左连接的子类。有什么问题?我对文档的理解有误吗?或者它是hibernate 4中的一个错误?我还没有看到任何带有休眠 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...
4

2 回答 2

4

这是一个常见的错误理解,我曾经也有同样的疑问..

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

显式多态性仅适用于根实体,并防止命名(未映射的)超类的查询返回映射的子实体

在您的情况下,如果 Entity Class Nodes未映射并且Persons具有显式多态性,则Nodes 不会返回 Persons elements

看看这段代码。。

@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 {
}

它基本上与每个人的想法相反。!

于 2013-08-21T13:32:42.573 回答
1

如果您查看PolymorphismType.EXPLICIT的定义,它会说:

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

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

于 2013-08-21T16:32:20.167 回答