我希望有人经历过类似的事情并可以帮助我:
我正在使用 graphql-java (以及 spring、graphql-java-tools 等)和 hibernate,并且我遇到了一个奇怪的问题:
每当我执行查询(或突变)并通过 Hibernate 加载实体时,它都会自动延迟加载关系。我在查看 Hibernates 查询日志时可以看到这一点。
即使我没有在查询中加载该字段,甚至当我从架构中完全删除该字段时也会发生这种情况。
示例,给定以下架构:
query {
getAllItems: [Item!]!
}
Item {
id: String!
name: String!
owner: Person!
}
Person {
id: String!
name: String!
items: [Item!]!
}
和一个 Hibernate 实体(伪代码):
@Entity
class Item {
@Id
private String id
@Column
private String name
@ManyToOne(fetch = FetchType.LAZY)
private: Person
...
}
以下查询:
getAllItems {
id
name
}
仅加载项目的 hibernate 查询最终会首先获取一个查询中的所有项目,然后在每个单独的查询中获取所有所有者(除非多个项目中的所有者相同,则其从 hibernate 缓存返回)。
所以我的想法是 graphql-java 递归地扫描返回给它的对象,这会导致 hibernate 代理获取。
我的说法正确吗,或者您认为我的问题与 graphql-java 完全无关吗?
更新:
我发现这与graphql无关,是hibernate引起的。我的关系设置为 LAZY,但 Hibernate 忽略了这一点,并对每个人进行查询。因此,首先是获取所有 Item 的查询,然后是针对每个 Person (n+1) 的查询。而且我自己不访问代理。
我像这样创建查询(这是 kotlin):
entityManager
.createQuery("SELECT i FROM Item i", Item::class.java)
.setMaxResults(1000)
.resultList
最佳答案
澄清一下,这与 GraphQL 无关。
默认情况下,Hibernate 急切地加载一对一关系。
要更改此行为,请使用注释人员字段
@OneToOne(fetch = FetchType.LAZY)
关于java - graphql-java 和 hibernate - 查询中甚至未指定的延迟加载关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52546418/