首页 > 解决方案 > 在休眠中添加一个懒惰的孩子

问题描述

想要添加子对象而不获取它但得到 LazyInitializationException。我的孩子是拥抱列表,所以不想获取所有孩子只是为了添加一个孩子对象。

@Entity
public class JobRunId{
    @OneToMany(mappedBy = "jobRun", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<JobStep> jobSteps = new ArrayList<>();

    public void addStep(JobStep jobStep) {
        if (jobStep != null) {
            jobStep.setJobRun(this); 
            this.jobSteps.add(jobStep);// here getting LazyInitializationException
        }
    }
}

service class

jobRun = repository.findById(id);
//Dont want to do hibernate.initialize here as want to avoid fetch all 
 child records
JobStep jobStep = new JobStep();
//some jobStep status
jobRun.addStep(jobStep);//adding one step here to jobRun.getting error

有没有办法只添加一个子记录而不获取所有子记录。

标签: javahibernatespring-data

解决方案


有没有办法只添加一个子记录而不获取所有子记录。

考虑到要添加JobStep给定的实体JobRunId,可以使用JOIN FETCH查询之类的指令。该JOIN FETCH指令指示 Hibernate 发出一个INNER JOIN与其 JobStep 一起获取的所以 JobRunId。createQuery 看起来类似:

    SELECT js
    FROM JobStep js
    JOIN fetch js.jobRunId 
    WHERE js.id = :jobId"

另一种方法是使用 DTO 投影,如果您不想修改实体,则使用 DTO 投影。基本上,它允许您获取更少的列。

我不确定这种关系的确切细节以及您为什么要这样管理。这是阅读处理 LazyInitializationException 的最佳方法的好文章。希望这会给您提供解决问题的见解。


推荐阅读