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

标签 java hibernate jpa orm entitygraph

hibernate 5.0.10 我定义了一个看起来像这样的子图:

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

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

最佳答案

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

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

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

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

关于java - 如何限制 Hibernate 实体图中使用的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42211312/

相关文章:

java - "org.apache.openjpa.persistence.PersistenceException: null"错误

java - 如何用jpa映射抽象集合?

java - 在 Java 中比较两个 JSON 文件的最佳方法

java - Hibernate:用另一个文件覆盖xml配置文件

java - 获取事务在不同线程异常中回滚

java - 创建自定义 JPA 时间注释

java - 内部源保留注释的表示

应用程序启动方法中的Javafx错误异常未指定 Controller

java - 惰性抓取问题

java - 如何在NamedQuery中使用正确的HQL