簡體   English   中英

當我對實體 object 執行 saveAndFlush 時,我看到 hibernate 生成 2 個更新查詢。 為什么會這樣以及如何避免?

[英]When I do saveAndFlush on an entity object, I see hibernate generates 2 update queries. Why is it and how to avoid it?

這些是我正在做的步驟 - 1.加載實體 2.更新實體上的幾個字段。 3.saveAndFlush

我看到一個更新查詢,在步驟#2 中更新了所有 3 個字段。 其他更新查詢正在更新 3 個字段之一,但該值來自 Step#1 而不是 Step#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. saveAndFlush 實體 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM