java - 在休眠中添加一个懒惰的孩子
问题描述
想要添加子对象而不获取它但得到 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
有没有办法只添加一个子记录而不获取所有子记录。
解决方案
有没有办法只添加一个子记录而不获取所有子记录。
考虑到要添加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 的最佳方法的好文章。希望这会给您提供解决问题的见解。
推荐阅读
- python-3.x - 尝试初始化所有可用的操纵杆并将它们的名称放在列表中
- android - Robolectric 是单元测试还是集成测试?
- c# - C# 库适用于 .NET Core 3.1,但不适用于 UWP
- flutter - Flutter - 文本可见时文本字段失去焦点
- php - 每 4 个 div 包裹在一个 div 中
- python - 雪花 SQL 安装期间的错误
- asp.net-core - 全球防伪令牌验证问题
- c# - Plesk 网站中的 Hangfire 重复作业无法正常工作
- javascript - IE11 - 无法添加第二个 optgroup 来选择
- android - 应用停止 android studio 时清除通知