【发布时间】:2019-04-01 21:30:35
【问题描述】:
我最初开始在我的@OneToOne 映射场景中解决 N+1 选择问题,我终于能够将多个选择查询减少到一个。我尝试使用 EntityGraphs 来解决 N+1 问题,但它不起作用。所以我将我的@OneToOne 映射更改为 LAZY,方法是将 fetch Type 设置为 Lazy 并设置 Optional=false。 我正在使用 Hibernate JPA。
我做了如下修改
Public Class Parent {
@OneToOne(
optional = false,
mappedBy = "parent",
fetch = FetchType.LAZY,
cascade = {CascadeType.ALL})
@NotFound
private Child child;
}
在我的孩子类中,
Public Class Child {
@Id
private String Id;
@OneToOne
@PrimaryKeyJoinColumn
private Parent parent;
}
Repository 类如下,
public interface ParentChildRepository extends PagingAndSortingRepository<Transaction, String> {
@EntityGraph(value = "Parent.EntityGraph", type = EntityGraphType.LOAD)
default List<Transaction> findall() {
return StreamSupport.stream(findAll().spliterator(), false).collect(Collectors.toList());
}
}
如果没有 optional = false,LazyLoading 不起作用,我会得到 N+1 Select 查询语句,但是当我设置 optional = false 时, 抛出 EntityNotFoundException 异常。当 optional=false 语句被删除/设置为 true 时,不会引发 EntityNotFoundException,但它不能解决我的 N+1 选择问题。
请提供一些建议。
【问题讨论】:
标签: java hibernate spring-mvc spring-boot jpa