在將實體ID持久化到數據庫之前,但在構造函數中立即爲實體分配ID會有巨大的價值:您的equals/hashcode實現變得微不足道,and it saves many headaches。jpa序列ID的生成
當實體等同性基於==
時,我看到了問題:代理進入會話,並且當它作爲真實對象被解包時,將得到equals()
,返回false
。
而且當你重寫equals
和hashcode
使用生成的ID,因爲僅在persist()
產生的一個,所有非持續的實體有ID null
,因此都彼此相等。
從我讀到的內容來看,當您使用傳統的ID生成技術(自動遞增)時,ID會在實體管理器刷新時生成。當您使用基於序列的解決方案時,它會持續生成。
這篇文章和我目前的理解說最簡單的解決方案是在創建時分配一個ID,而不是持續或刷新時間。並且序列看起來可以訪問,但JPA決定反對它。使用序列來獲取ID是很便宜的(正如您可以預取的那樣),JPA如何在對象構建時間內沒有提供至少一個選項來獲取基於序列的ID?如果實體實際上並沒有堅持到最後,那麼存在浪費一些ID的風險,但我認爲這不是一個大問題。
除此之外,就解決方案的簡單性和可理解性而言,唯一的「不妥協」似乎是UUID,它們有其自身的問題。
我錯過了什麼?是否有可能在某處某個JPA身份生成器或某個庫將基於序列並允許在施工時提供該ID?
我還是不明白。對於由序列支持的數字類型,如果預取序列值,您仍然可以批量寫入,但仍然可以獲得良好的索引,不需要刷新。在我有限的理解中,我沒有看到需要將持久化和實體分配給一個ID,所以我不明白爲什麼不在建造時分配一個先前保留的序列號作爲ID?特別是如果浪費不是問題。 – 2014-11-21 15:12:30
所以,我會使用prefetched序列值,而不是UUID,在我看來,我得到的UUID(在客戶端減ID生成)沒有性能和空間的擔憂,但我沒有找到一個現成的解決方案(發電機),這讓我感到驚訝。 – 2014-11-21 15:19:24
我建議你開始使用[pooled-lo optimizer](http://vladmihalcea.com/2014/07/21/hibernate-hidden-gem-the-pooled-lo-optimizer/)以及序列生成器。點擊此鏈接查看如何做到這一點。 – 2014-11-21 15:36:30