Spring Data JPA忽略了FetchMode

时间:2015-08-19 22:51:48

标签: java jpa spring-boot spring-data spring-data-jpa

我有2个实体。第一个是

public class TechnicalDataItem {

    @EmbeddedId
    private ItemLabelId id;

Id类是:

public class ItemLabelId implements Serializable {

    @Column(name = "ID")
    private String id;

    @ManyToOne
    @JoinColumn(name = "TECHNICAL_LABEL_ID")
    @Fetch(FetchMode.JOIN)
    private TechnicalLabel technicalLabel;

与@ManyToOne关系

public class TechnicalLabel {

    @Id
    private Long id;

    @Basic
    private String name;

    @Basic
    private String value;

当我尝试通过调用

从TechnicaDataItem加载所有数据时
technicalDataItemRepository.findAll()

我有一堆选择,负载很慢。不应该有加入,只有一个选择?我错过了什么吗?

technicalDataRepository是JpaRepository。

1 个答案:

答案 0 :(得分:2)

根据关系定义,您遇到了N + 1查询问题。默认情况下,JPA将执行多个选择以拉取子关系项。

您有TechnicalDataItem的一个选择,然后是TechnicalLabel的另外N个选择。

要绕过其他N个查询,请使用join fetch的{​​{1}}方法findAll。{/ p>

这是一个相同的例子。

technicalDataItemRepository

希望这有帮助。