JPA Eclipselink优化避免了多次调用(n + 1问题)

时间:2018-10-21 10:22:39

标签: java jpa eclipselink

我发现了一些有关使用Hibernate优化JPA的博客文章,但是对于EclipseLink,我的最佳研究结果是该注释,该注释可以神奇地解决JPA将命令转换为多个数据库调用的问题:https://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_batchfetch.htm

但是我不确定这是否是正确的解决方案,并且我不太了解如何使用它。

这是我的第一个导致多个呼叫的界面:

@Transactional
public interface CustomerorderRepository extends JpaRepository<Customerorder, Long>{
    default List<Customerorder> findAllOpenCustomerorders(Long userId) {
        return this.findAllByUserIdAndStatusIsOrderByCreatedAtAsc(userId, Status.OPEN);
    }
}

实体Customerorder包含两个可能与问题相关的字段:

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
@JoinColumn(name = "address_data")
@Getter(AccessLevel.PACKAGE)
@Setter(AccessLevel.PRIVATE)
private CustomerAddressdata customerAdressdata;

@OneToMany(mappedBy = "customerorder", cascade = CascadeType.ALL, orphanRemoval = true)
@OrderColumn(name = "id")
private List<Article> articles;

另一个遭受相同问题的呼叫接口是这个

@Transactional
public interface BusinessorderRepository extends JpaRepository<Businessorder, Long> {
    @Query(" select distinct foo.batz.businessorder from Foo foo " +
            " where foo.bar.businessId in :ids")
    List<Businessorder> getBusinessordersByFoobarIds(@Param("ids") List<Long> ids);
}

我对JPA性能优化的整个世界都是陌生的。任何提示如何解决此问题表示赞赏。谢谢。

0 个答案:

没有答案