2014-02-07 33 views
1

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

直到這一點,我一直堅持基於字符串的對象ID。這爲每個表添加了一個額外的列,但這並不妨礙我。

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

我總是將我的域類hashCode()和equals()方法基於UUID而不是主鍵。這很好,因爲UUID在整個生命週期中都保持不變,無論是在JVM還是在數據庫中。

如果我停止保持UUID,那麼hashCode()和equals()方法會是什麼樣子?它是否像兩層比較,首先使用主鍵(如果它不是null),然後使用對象ID(如果主鍵爲null)?

+0

爲什麼不使用UUID作爲主鍵? –

回答

1

正確實施equalshashCode是實體的一個相當大的問題。

如果您擁有「自然」主鍵(如人的社會安全號碼),則不必持續存在額外的業務鍵值。它可以是單個值或多個值的組合 - 例如名稱,姓氏,出生日期和地址的組合。如果你有這樣一個自然的PK,請使用它。如果你沒有它,使用UUID是創建一個好方法。

如果您使用的UUID爲equalshashCode,你也應該堅持,所以同一個記錄的兩個實例被認爲是相等的。

您的equalshashCode應基於此業務密鑰而不是基於DB提供的ID。如果使用DB提供的ID,則所有新實體均被視爲相同。這可能會導致意外的行爲,特別是在使用集合時。