java - Hibernate 延迟获取 - 获取子对象

标签 java hibernate spring-boot spring-data-jpa

我的理解是,默认情况下,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/

相关文章:

logging - 如何以及在哪里存储部署在 CF 或 Heroku 中的 Spring Boot 应用程序中的日志文件?

java - 我们可以在 spring boot 应用程序中随机执行另一个主要功能的单独进程吗?

java - 如何判断我的 Spring boot 应用程序是否处于 Debug模式?

java - 创建自定义listView android时如何存储复选框的值

java - Maven组装插件添加依赖项

java - 设置IntelliJ中用于测试的Java系统属性

java - 基本路径使用异常 : Cannot join to attribute of basic type

java - 在 aws elastic beanstalk 上上传文件?

java - Libgdx 游戏在 Android 上崩溃

java - 在 Spring Boot 1.3.1.RELEASE 中升级到 Hibernate 5.0.6.Final 后嵌入式字段不起作用