我有一个 N+1 问题,我想编写某种自动回归测试,因为它非常影响性能。
我想过监视 EntityManager 并验证它的方法createQuery()只调用一次,但是 Hibernate 不使用它来初始化惰性关系,因此它不起作用。我也可以尝试关闭我的存储库和我的服务之间的 JPA 事务(或分离我的实体)并寻找异常,但这确实是一个丑陋的想法。
为了给我们一个框架,假设我们有一个非常简单的父子模型:
@Entity
public class Parent {
…
@OneToMany(fetch = FetchType.LAZY, mappedBy = "parent")
private Collection<Child> children;
}
@Entity
public class Child {
…
@ManyToOne
private Parent parent;
}
Run Code Online (Sandbox Code Playgroud)
还有一个非常简单的服务:
public class MyService {
…
public void doSomething(Long parentId) {
Parent parent = …; /* retrieve Parent from the database */
doSomeOtherThing(parent.getChildren());
}
}
Run Code Online (Sandbox Code Playgroud)
从数据库中检索父级可以使用以下两个查询:
SELECT parent FROM Parent parent WHERE parent.id = :id;
SELECT parent FROM Parent parent …Run Code Online (Sandbox Code Playgroud)