4

Hibernate 5.0.10 我定义了一个子图,如下所示:

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

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

4

2 回答 2

3
  1. 如果您谈论的是基本类型,那么默认情况下,Hibernate 将始终获取它们。启用它的唯一方法是设置@Basic(fetch=LAZY)实体属性并启用字节码增强。
  2. 如果您正在谈论 EAGER 关联,那么 Hibernate 不能将它们覆盖为 LAZY,即使 JPA 标准规定应该这样做。

从 JPA 的角度来看,这些策略不是强制性要求,因为 LAZY 只是对 JPA 提供者的提示。

总而言之,JPA 实体图是获取数据的次优方式。避免FetchType.EAGER关联、使用子实体和 DTO 投影比实体图要好得多。

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

于 2017-02-13T19:01:34.730 回答
1

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

于 2017-02-14T07:28:28.390 回答