在我的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选择问题?我不想将GeneStory
与Gene
一起加载。我需要在需要时懒得加载它们。
答案 0 :(得分:1)
根据JPA规范:
延迟提取是对持久性提供程序的提示,可以 通过Basic,OneToOne,OneToMany,ManyToOne指定, ManyToMany和ElementCollection注释及其XML 当量
EAGER策略是持久性提供程序的要求 运行时必须急切地获取数据。 LAZY战略是一个提示 持久性提供程序运行时应该懒惰地获取数据 什么时候第一次访问。 允许实施热切 获取已指定LAZY策略提示的数据。