【发布时间】:2020-07-14 02:11:52
【问题描述】:
我附在我的代码下方。当我得到所有父实体时,一个一个地加载孩子。如何解决?
父实体类。它具有 3 个属性,即 id、name 和 children。孩子属性加载急切。因为我需要父对象及其子对象。
@Entity
@Table(name = "parent")
public class Parent {
@Id
private int id;
private String name;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.EAGER, orphanRemoval = true)
private List<Child> children;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public List<Child> getChildren() {
return children;
}
public void setChildren(List<Child> children) {
this.children = children;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
儿童班。它具有 3 个属性,例如 id、name 和 parent。父属性加载为惰性模式。因为我从不想要子对象和它的父对象。
@Entity
@Table(name = "child")
public class Child {
@Id
private int id;
@Column(name = "name")
private String name;
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent", referencedColumnName = "id")
private Parent parent;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
}
}
我尝试让所有父母使用以下代码。
protected List getAll(){
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
List<Parent> objects = entityManager.createQuery("Select o from Parent o", Parent.class).getResultList();
entityManager.getTransaction().commit();
entityManager.close();
return objects;
}
我希望只有一个连接查询。但是hibernate调用会一一查询。它得到 n+1 查询问题。
Hibernate: select parent0_.id as id1_8_, parent0_.name as name2_8_ from parent parent0_
Hibernate: select children0_.parent as parent3_0_0_, children0_.id as id1_0_0_, children0_.id as id1_0_1_, children0_.name as name2_0_1_, children0_.parent as parent3_0_1_ from child children0_ where children0_.parent=?
Hibernate: select children0_.parent as parent3_0_0_, children0_.id as id1_0_0_, children0_.id as id1_0_1_, children0_.name as name2_0_1_, children0_.parent as parent3_0_1_ from child children0_ where children0_.parent=?
Hibernate: select children0_.parent as parent3_0_0_, children0_.id as id1_0_0_, children0_.id as id1_0_1_, children0_.name as name2_0_1_, children0_.parent as parent3_0_1_ from child children0_ where children0_.parent=?
【问题讨论】:
-
对n+1问题使用join fetch
-
我们为什么要这样操作手动查询?为什么休眠不能管理这些情况。 FetchType.EAGER 是什么意思?
-
您认为 FetchType.EAGER 是什么意思?看到这个docs.jboss.org/hibernate/orm/5.4/userguide/html_single/…
标签: hibernate spring-data-jpa spring-data