我目前正在将我的 REST-Server 迁移到 GraphQL(至少部分地)。大部分工作已经完成,但我偶然发现了这个我似乎无法解决的问题:Graphql 查询中的 OneToMany 关系,使用 FetchType.LAZY。
我正在使用: https ://github.com/graphql-java/graphql-spring-boot 和 https://github.com/graphql-java/graphql-java-tools进行集成。
这是一个例子:
实体:
@Entity
class Show {
private Long id;
private String name;
@OneToMany(mappedBy = "show")
private List<Competition> competition;
}
@Entity
class Competition {
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY)
private Show show;
}
架构:
type Show {
id: ID!
name: String!
competitions: [Competition]
}
type Competition {
id: ID!
name: String
}
extend type Query {
shows : [Show]
}
解析器:
@Component
public class ShowResolver implements GraphQLQueryResolver {
@Autowired
private ShowRepository showRepository;
public List<Show> getShows() {
return ((List<Show>)showRepository.findAll());
}
}
如果我现在使用此(速记)查询查询端点:
{
shows {
id
name
competitions {
id
}
}
}
我得到:
org.hibernate.LazyInitializationException:未能延迟初始化角色集合:Show.competitions,无法初始化代理 - 无会话
现在我知道为什么会发生这个错误以及它意味着什么,但我真的不知道要为此应用修复程序。我不想让我的实体急切地获取所有关系,因为这会否定 GraphQL 的一些优势。我可能需要寻找解决方案的任何想法?谢谢!