如何限制 Hibernate 实体图中使用的列

问题描述 投票:0回答:2

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

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

问题是,当使用这个子图时,我会返回根表(名称存在的地方)中定义的所有属性,而不仅仅是我指定的子图属性。 有没有办法告诉休眠不获取那些孩子? 我的查询看起来就像

select rec from records rec join rec.proc

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

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

总而言之,JPA 实体图是一种次优的数据获取方式。避免

FetchType.EAGER
关联、使用子实体和 DTO 投影比实体图好得多。

大多数时候,您甚至不需要获取实体,因为仅当您计划修改实体时实体才有意义。否则,DTO 投影始终会更加高效。


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.