簡體   English   中英

是否在JPA實體上保留隨機UUID作為對象ID?

[英]Persit random UUID serving as object ID on JPA entity?

我喜歡對我所有的JPA域實體使用BaseDomain類。 在基類中,我有一個對象ID(存儲為字符串),是從UUID.random()生成的。 在創建對象時分配對象ID。 實體類還具有主鍵,在持久化時由數據庫分配。

到目前為止,我一直堅持基於字符串的對象ID。 這會在每個表中添加一個額外的列,但這不會打擾我。

我想知道-是否有任何理由要保留對象ID(生成的UUID)? 還是應該將隨機UUID留在Java空間中?

我總是將域類hashCode()和equals()方法基於UUID而不是主鍵。 這很好,因為在JVM和數據庫中,UUID對於給定實體在整個生命周期中都保持不變。

如果我停止保留UUID,hashCode()和equals()方法將是什么樣? 就像兩層比較一樣,如果主鍵不為null,則首先使用主鍵;如果主鍵為null,則使用對象id。

對實體而言, equalshashCode的正確實現確實是一個大問題。

如果您擁有“自然”主鍵(例如某人的社會保險號),則不必保留額外的業務鍵值。 它可以是單個值,也可以是值的組合-例如名稱,姓氏,生日和地址的組合。 如果您具有這樣的自然PK,請使用它。 如果您沒有它,使用UUID是創建一個的好方法。

如果將UUID用作equalshashCode ,則還應保留它,因此同一記錄的兩個實例被視為相等。

您的equalshashCode應該基於此業務密鑰,而不是基於數據庫提供的ID。 如果使用數據庫提供的ID,則將所有新實體視為相等。 這可能會導致意外的行為,尤其是在使用Collection時。

暫無
暫無

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

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