用于可迭代对象的 Java GraphQL 解析器:休眠异常

Posted

技术标签:

【中文标题】用于可迭代对象的 Java GraphQL 解析器:休眠异常【英文标题】:Java GraphQL Resolver for iterable object: Hibernate Exception 【发布时间】:2019-10-29 22:52:51 【问题描述】:

我正在使用 Spring Boot 实现 GraphQL 服务器,但是,在为具有多对多关系的模型编写解析器时遇到了一些麻烦。以下解析器类中的函数getBooks 会抛出以下错误:

package com.example.DemoGraphQL.resolver;

import java.util.Set;
import java.util.stream.Collectors;

import com.coxautodev.graphql.tools.GraphQLResolver;
import com.example.DemoGraphQL.model.Author;
import com.example.DemoGraphQL.model.Book;
import com.example.DemoGraphQL.repository.AuthorRepository;
import com.example.DemoGraphQL.repository.BookRepository;

public class AuthorResolver implements GraphQLResolver<Book> 
    private BookRepository bookRepository;

    public AuthorResolver(BookRepository bookRepository) 
        this.bookRepository = bookRepository;
    

    public Iterable<Book> getBooks(Author author) 
        Set<Long> ids = author.getBooks().stream().map(book -> book.getId()).collect(Collectors.toSet());
        return bookRepository.findAll(ids);
    


错误信息:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.example.DemoGraphQL.model.Author.books, could not initialize proxy - no Session

当我只查询给定模型的一个对象时,我能够实现类似的解析器。任何建议表示赞赏。

【问题讨论】:

【参考方案1】:

我通过将fetch=FetchType.Eager 添加到我的多对多装饰器来解决此问题。

@ManyToMany(fetch = FetchType.EAGER, cascade =  CascadeType.ALL )

这显然不是大规模的高性能解决方案。

【讨论】:

以上是关于用于可迭代对象的 Java GraphQL 解析器:休眠异常的主要内容,如果未能解决你的问题,请参考以下文章

迭代器与生成器 全面解析

NodeJs 中的 GraphQl - 对象类型的解析器

python:可迭代对象,迭代器,生成器函数,生成器的解析举例代码说明

python:可迭代对象,迭代器,生成器函数,生成器的解析举例代码说明

可迭代对象迭代器生成器的理解

代码详解生成器迭代器