HIbernate加载子类和类

rim*_*ima 8 java orm hibernate

我正在使用Hibernate连接到我的数据库.我的应用程序中有一个继承结构.问题是,当我执行像"from Animal"这样的查询时,它为Animal类,它的子类以及Animal及其子类的所有关联做了一个左外连接.我如何避免这种情况.我想只在我通过条件查询中的fetchmode指定数据时加载数据?

Pas*_*ent 17

是的,Hibernate支持多态查询.从文档:

14.8.多态查询

像这样的查询:

from Cat as cat
Run Code Online (Sandbox Code Playgroud)

不仅返回Cat子类的实例,还返回子类的实例DomesticCat.Hibernate查询可以命名from子句中的任何 Java类或接口.该查询将返回扩展该类或实现该接口的所有持久化类的实例.以下查询将返回所有持久对象:

from java.lang.Object o
Run Code Online (Sandbox Code Playgroud)

接口Named可能由各种持久化类实现:

from Named n, Named m where n.name = m.name
Run Code Online (Sandbox Code Playgroud)

最后两个查询将需要多个SQL SELECT.这意味着order by子句没有正确排序整个结果集.这也意味着您无法使用调用这些查询Query.scroll().

这是默认行为(称为隐式多态),Hibernate支持隐式显式多态:

隐式多态意味着类的实例将由命名任何超类或实现的接口或类的查询返回,并且类的任何子类的实例将由命名类本身的查询返回.显式多态意味着类实例将仅由显式命名该类的查询返回.命名该类的查询将仅返回在此<class>声明中映射的子类的实例 作为 <subclass><joined-subclass>.在大多数情况下,默认值 polymorphism="implicit"是合适的.当两个不同的类映射到同一个表时,显式多态性很有用.这允许包含表列子集的"轻量级"类.

这可以在类级别配置.使用polymorphism="explicit",如果你是,如果你是使用XML映射,请参阅5.1.3类.@Entity如果您正在使用注释,请使用Hibernate的注释,请参阅2.4.1.实体.下面是一个例子:

@javax.persistence.Entity
@org.hibernate.annotations.Entity(polymorphism = PolymorphismType.EXPLICIT)
@Inheritance(strategy = InheritanceType.JOINED)
public class Foo {
    ...
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*zyk 0

基本上它是 Hibernate 使用的默认 ORM 继承设计模式,称为类继承(所有类都映射到单个表),如果你想更改它,你可以 google:
- single class hierarhy or table per class (这将映射每个类到数据库中的单独表)
- 具体类层次结构(这将仅将具体实现映射到表)。