簡體   English   中英

當分離的實體版本屬性為null時,為什么Hibernate實體管理器執行插入操作而不是更新操作?

[英]Why does Hibernate entity manager perform insert instead of update when dettached entity version property is null?

我注意到,當您擁有一個具有@Version屬性的實體,並嘗試通過手動實例化該實體,將其ID設置為現有ID並調用merge()來更新記錄時,Hibernate會執行插入操作而不是更新操作。 我認為這是因為在手動實例化的對象上,version屬性為null。 標識符的存在是否不足以讓Hibernate確定應該執行更新?

示例代碼:

假設數據庫中有一條ID = 1的記錄,而MyEntity的屬性版本為@Version。

MyEntity e = new MyEntity();
e.setId(1);
e.setName("some updated value");

entityManager.merge(e);

最終執行插入操作而不是執行更新操作。

MyEntity類似於:

@Entity
public class MyEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Integer id;

    @Column("name")
    String name;

    @Version
    Integer version;

}

如果刪除@Version,它會按預期工作,則ID = 1的記錄將更新。

該文檔證實了您的經驗:

對於分離的實例,version或timestamp屬性不應為null。 Hibernate會將任何具有空版本或時間戳的實例檢測為瞬態,而不管指定了其他哪些未保存值的策略。

即使使用ID來確定實體是否分離,嘗試合並具有空版本的實體也將導致樂觀鎖異常。 您根本不應該合並具有空版本的分離對象。 這違反了使用樂觀鎖定的目的。

暫無
暫無

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

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