当我在实体对象上保存和刷新时,我看到休眠生成 2 个更新查询.为什么会这样以及如何避免它?



这些是我正在做的步骤 - 1.加载实体 2.更新实体上的几个字段。 3.保存和冲洗

我看到一个更新查询,其中 3 个字段在 Step#2 中更新。 其他更新查询正在更新 3 个字段之一,但该值来自步骤 #1 而不是步骤 #2。

有人可以帮我弄清楚如何避免这种情况吗?

编辑 - 添加了我的课程。

@Entity
@DynamicUpdate
public class Enrollment
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Embedded
private Section sectionInformation = new Section();
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH})
@JoinColumn(name = "student_id")
private Student student;
@Enumerated(EnumType.STRING)
private TakingExam takingExam;
}
public ResponseEntity controllerMethod(){
Enrollment enrollment = service.getEnrollment(enrollmentId);
if (enrollment == null)
{
return new ResponseEntity<>(NOT_FOUND);
}

Enrollment otherEnrollment = null;
if (check some condition)
{
otherEnrollment = 
service.getEnrollment(request.someValue());
validator.validateOtherEnrollment(enrollment, 
otherEnrollment, request.someValue());
}
enrollment.takingExam(request.getTakingExam());
if (otherEnrollment != null)
{
service.swapEnrollments(enrollment, otherEnrollment);
}
}
private void swapEnrollments(Enrollment enrollment, String userName){
///lots of validations
enrollment.setUpdatedBy(userName);
fromEnrollment.setUpdatedDate(new 
Timestamp(System.currentTimeMillis()));
enrollmentRepo.saveAndFlush(enrollment); ---- THIS IS WHERE I SEE 2 UPDATE QUERIES AS PUT BELOW
}
update
enrollment 
set
taking_exam=?,
updated_by=?,
updated_date=? 
where
id=?
update
enrollment 
set
taking_exam=? 
where

这就是我的代码中发生的事情 -

  1. 加载实体 1
  2. 加载实体 2
  3. 更新实体 1 上的几个字段。
  4. 更新实体 2 上的几个字段
  5. saveAndFlush 实体 1 - 此步骤创建 2 个更新查询。

这有助于避免中间自动冲洗

  1. 加载实体 1
  2. 加载实体 2
  3. 更新实体 1 上的几个字段。
  4. saveAndFlush 实体 1 -- 仅生成 1 个更新查询!
  5. 更新实体 2 上的几个字段
  6. 保存和刷新实体 2

最新更新