我的理解是,默认情况下,Hibernate 会将所有关系类型的 FetchType 设置为惰性。
就我而言,我有一个双向 OneToMany-ManyToOne 关系,如下所示:
父类:
public class Parent{
@Id
@Column(name = "parent_id")
private long parentId;
@OneToMany(mappedBy = "parent")
@JsonIgnore
private List<Child> children;
public List<Child> getChildren()
{
return this.children;
}
}
子类:
public class Child
{
private String name;
@ManyToOne(optional = false) //every child must have a parent
@JoinColumn(name = "parent_id")
private Parent parent;
public Child(Parent parent, String name)
{
this.parent = parent;
this.name = name;
}
}
child 服务:
public class ChildService
{
public List<Child> getChildren(long parentId)
{
Parent parent = getParentRepository().findOne(parentId);
return parent.getChildren(); //This returns null
}
public Child getNamedChild(long parentId)
{
Parent parent = getParentRepository().findOne(parentId);
//???????????????
//Not sure how to get the children of this specific parent,
//which has a specific name.
}
}
父存储库:
public interface ParentRepository extends JpaRepository<Parent, Long> {
}
我这里有两个问题:
当我在ChildService中调用方法getChildren()时,它返回null。数据库确实包含正确的数据。 我需要使用 LAZY fetch 类型来获取这些。 我尝试在返回之前调用“parent.getChildren().size()”方法,但它仍然返回 null。
另一个问题是如何获得具有特定名称的 child ?是否可以通过存储库来完成?或者我是否需要 getChildren(parentId),并迭代直到找到以特定方式命名的那个?
编辑: 经过一些建议后,我继续以这种方式实现我的 ChildRepository:
public interface ChildRepository extends JpaRepository<Child, Long> {
@Query("SELECT child FROM Parent parent JOIN parent.child AS child WHERE parent.parentId = :parentId")
List<Child> getChildren(@Param("parentId") String parentId);
@Query("SELECT child FROM Parent parent JOIN arent.child AS child WHERE parent.parentId = :parentId AND child.childId = :childId")
Child getChildByName(@Param("childId") Long childId, @Param("parentId") String parentId);
}
最佳答案
你能注入(inject)EntityManager吗?在 ChildService 类中?我无法完全验证下面的代码,但您可以尝试类似的方法
public class ChildService
{
private EntityManager em;
public List<Child> getChildren(long parentId)
{
Query query = em.createQuery("SELECT c FROM Parent p JOIN FETCH p.children AS c WHERE p.parentId = :parentId");
query.setParameter("parentId", parentId);
return (List<Child>) q.getResultList();
}
public Child getNamedChild(long parentId, String name)
{
Query query = em.createQuery("SELECT c FROM Parent p JOIN FETCH p.children AS c WHERE p.parentId = :parentId AND c.name = :name");
query.setParameter("parentId", parentId);
query.setParameter("name", name);
return (Child) q.getSingleResult();
}
}
关于java - Hibernate 延迟获取 - 获取子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45570884/