2017-02-13 69 views
2

Hibernate的使用如何限制列5.0.10 我有一个子定义是这样的:在一个Hibernate实体图

@NamedSubgraph(name = "proc", attributeNodes = { @NamedAttributeNode("name"), @NamedAttributeNode("childTable1"), @NamedAttributeNode("childTable2"), @NamedAttributeNode("childTable3"), @NamedAttributeNode("childTable4") }),

的问题是,使用这个子图的时候,我得到取回在根表(其中名称存在)中定义的所有属性,而不仅仅是指定的子图属性。有没有办法告诉hibernate不去取这些孩子?我的查询看起来就像select rec from records rec join rec.proc

回答

2
  1. 如果你谈论的是基本类型,那么,在默认情况下,Hibernate总是会接他们。启用基本类型延迟加载的唯一方法是使用字节码增强,如this article中所述。
  2. 如果您正在谈论EAGER关联,那么即使JPA标准认为它应该,Hibernate也无法将它们重写为LAZY。

从JPA的角度来看,1.和2.都不是强制要求,因为LAZY只是JPA提供者的提示。

总而言之,JPA实体图是获取数据的次优方式。 Avoiding EAGER associations,using subentities和DTO预测比实体图好得多。

大多数情况下,您甚至不需要获取实体,因为实体只有在计划修改时才有意义。否则,DTO投影总是会更有效率。

+0

那么在这种情况下,急切的加载只是问题的一部分。我很好奇DTO方法。你在说将结果集映射到一个实体吗?而不是'Object []'? –

+0

另外,在查看字节码增强时,我还需要'@Basic(LAZY)'属性吗? –

+0

您可以使用构造函数子句或Hibernate'ResultTransformer'将结果直接映射到DTO。至于BE,我想你需要'@Basic(LAZY)'来启用属性的延迟加载。否则,基本属性是EAGER。 –

0

我写了一篇关于如果您有兴趣使用实体模型here时可能遇到的所有问题的文章。所以一般来说,如果可能的话你应该避免这种情况 你可能想给Blaze-Persistence Entity Views一个尝试,这正是它的用例。您可以定义目标结构,即DTO作为接口并将属性映射到JPQL表达式。这也支持集合等,但在JPQL级别而不是SQL级别上工作。

相关问题