OneToOne Spring JPA MySQL LAZY加载N + 1选择

时间:2015-10-08 18:29:30

标签: mysql spring hibernate jpa spring-data

在我的Spring JPA / Data MySQL应用程序中,我有以下内容:

public class Gene implements Serializable {

    @Id
    @Column(name = "uid")
    private String uid;

    @OneToOne(fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "gene")
    private GeneStory geneStory;

}

public class GeneStory implements Serializable {

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "gene_uid", referencedColumnName = "uid")
    private Gene gene;

}

我正在尝试通过

加载所有Gene
Query q = em.createQuery("select g from Gene g")
return q.getResultList();

我得N+1 selects problem GeneStory

现在,在数据库中的每个Gene,我都有GeneStory的其他查询,如下所示:

select genestory0_.story_id as story_id1_7_0_ ... from gene_stories genestory0_ where genestory0_.gene_uid=?

GeneStory的延迟加载由于某种原因不起作用。

gene_storie表中的数据库层,我也有一个约束 -

CONSTRAINT `fk_gene_stories_gene_uid`
    FOREIGN KEY (`gene_uid`)
    REFERENCES `gene` (`uid`)

如何修复此N + 1选择问题?我不想将GeneStoryGene一起加载。我需要在需要时懒得加载它们。

1 个答案:

答案 0 :(得分:1)

根据JPA规范:

  

延迟提取是对持久性提供程序的提示,可以   通过Basic,OneToOne,OneToMany,ManyToOne指定,   ManyToMany和ElementCollection注释及其XML   当量

     

EAGER策略是持久性提供程序的要求   运行时必须急切地获取数据。 LAZY战略是一个提示   持久性提供程序运行时应该懒惰地获取数据   什么时候第一次访问。 允许实施热切   获取已指定LAZY策略提示的数据

相关问题