簡體   English   中英

如果主鍵不為null,Spring數據JPA不允許持久化Entity

[英]Spring data JPA does not allow an Entity to be peristed if the primary key is not null

我有一個訂戶實體,它使用用戶提供的電子郵件地址作為主鍵,而不是自動生成的值。 這意味着,當調用JpaRepository的save方法時,主鍵值不為null

Spring數據JPA 文檔 第2.2.1節的表2.2表示以下內容:

默認情況下,Spring Data JPA檢查給定實體的ID屬性。 如果Id-Property為null,則該實體將被假定為新實體,否則為非新實體。

此行為可防止將新的訂戶實體保留到數據庫中。

在決定如何選擇實體的主鍵時,我們有兩個選擇。 1.使用Spring提供的自動生成的密鑰。2.使用自定義的主密鑰,例如電子郵件地址。

自動生成的密鑰更易於使用。 當持久化實體時,Spring會注意到id字段為空,並得出結論認為這是一個持久的新實體。 新的自動生成的值將分配給id字段,並且該實體將保留下來。 但是,如果要確保不保留具有相同電子郵件地址的兩個實體,請記住使用@Column(unique="true")注釋電子郵件字段。 由於對電子郵件字段有獨特的限制,因此檢測重復項也很容易。

但是,有時您不想使用自動生成的密鑰,因為您可能希望使用用戶提供的電子郵件地址作為密鑰。 這種方法沒有問題。 用@Id標記實體中的電子郵件字段。 就這樣。 但是,不可能進行重復檢測。 如果多次收到創建具有相同電子郵件地址的實體的請求,則每次都會更新同一實體,即,每次都會執行EntityManager.merge() 不會違反約束異常。 回想一下,Spring始終檢查主鍵字段是否為空,以決定是創建新實體還是合並到現有實體中。

同一張表告訴您如何自定義該行為。

讓您的實體實現Persistable並覆蓋isNew ,或者提供EntityInformation的自定義實現。

暫無
暫無

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

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