добавить ленивого ребенка в спящий режим - PullRequest
0 голосов
/ 16 марта 2020

Хотите добавить дочерний объект, не извлекая его, но получая 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

есть способ просто добавить одну дочернюю запись без извлечения всех дочерних записей.

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Сохраните ваш jobStep напрямую (т. Е. Используйте что-то вроде em.persist(jobStep) или JobStepRepository.save(jobStep) ...

ПРИМЕЧАНИЕ: экземпляр JobStep должен иметь ссылку на JobRunId, который уже сохранен ...

0 голосов
/ 16 марта 2020

есть способ просто добавить одну дочернюю запись без извлечения всех дочерних записей.

Учитывая, что вы хотите добавить JobStep сущностей заданной JobRunId, вы можете использовать Директива JOIN FETCH как запрос. Директива JOIN FETCH указывает Hibernate на выдачу INNER JOIN, поэтому JobRunId извлекается вместе с его JobStep. CreateQuery будет выглядеть примерно так:

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

Альтернативный подход - использовать проекцию DTO, если вы не хотите изменять сущность, используйте проекцию DTO. По сути, это позволяет вам извлекать меньше столбцов.

Я не уверен в точных деталях отношения и почему вы управляете таким образом. Вот хорошая статья для чтения Лучший способ справиться с LazyInitializationException . Надеюсь, это поможет вам решить вашу проблему.

...