簡體   English   中英

Spring JpaRepository:delete(),在同一事務中使用后續的save()

[英]Spring JpaRepository: delete() with subsequent save() in the same transaction

我的實體同時具有自動生成的主鍵(id)和業務鍵(命名空間)。 我需要通過替換舊記錄來更新記錄。 所以,我是按業務鍵搜索它,刪除它並保存一個新實體。 如果它自己的事務中的每個操作都有效。 但是,一旦我將所有這些都放在同一個事務中,在執行save()時,delete()還沒有執行,所以我得到了一個約束違規。

transactionTemplate.execute(status -> {
    MyEntity oldEntity = repository.findByNamespace(namespace);
    if (oldEntity != null) {
        repository.delete(oldEntity);
    }
    repository.save(newEntity);
    return null;
});

我實際上設法通過添加繞過它

repository.flush();

但我真的不知道為什么我需要這個flush()。

因為repository.flush()通過調用EntityManager.flush()來刷新對數據庫的更改。 所以當你在delete()之后刷新更改時,會執行sql並且以下保存沒有問題。

如果不調用flush,則由持久性提供程序決定何時刷新更改,事務提交時間為截止日期。 提供者也不會以任何特定順序刷新更改,因此有時您的操作會成功,有時則不會。 通常,提供程序會等到提交時間刷新,但您可以通過設置刷新模式來影響它:

for entitymanager
EntityManager.setFlushMode(FlushModeType type);

or for query
Query.setFlushMode(FlushModeType type);

在Spring數據JPA中也有一個相同的設置,我敢肯定,但我不知道它是哪一個。

但請注意,立即刷新更改會降低性能,因此在使用時應小心。 在您的特定情況下,最好更新實體,然后刪除它,然后使用相同的業務鍵保留新實體。

暫無
暫無

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

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