java - graphql-java 和 hibernate - 查询中甚至未指定的延迟加载关系

标签 java hibernate spring-boot graphql graphql-java

我希望有人经历过类似的事情并可以帮助我:

我正在使用 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/

相关文章:

java - Servlet+jQuery/Ajax - 意外的 token o

java - 像 startsWith() 不是 equals() 这样的快速字符串搜索

java - 使用java从txt文件中检索数据并将数据替换到新的txt文件中

java - Spring AOP 在 Spring Boot 2.1.6 应用程序中没有被调用

java - 有没有类似的jtrac票务系统?

java - Hibernate:将基类的实例更改为子类

java - 分离的实体未正确合并?

hibernate - 如何覆盖单个字段上的 AccessType

java - JPA错误参数异常: SQL String cannot be NULL: despite CrudRepository save function recieving populated entity

java - 在 Java Spring Boot 中从 Principal 中提取数据