2011-12-08 58 views
4

我決定使用滿足以下要求的Hibernate id生成器:​​ - 從不同應用程序(不同JVM)訪問域時的安全ID生成 - 使用ID間隔(不要查詢數據庫中每個需要一個新的ID時間)休眠。增強標識符生成器

一些調查,我選擇的2休眠增強的標識符生成一個之後,它的

org.hibernate.id.enhanced.TableGenerator

問題是,這個算法保留在數據庫中不是下一個可用的值,而是下一個可用區間的末尾,所以,假設我有一個id生成器,其中increment_size爲10,當我爲一個ID請求時,我收到間隔1 - 10,但現在數據庫中存儲的不是值11,而是21.有了這個行爲,我必須沿着映射到特定表的所有類保持increment_size一致。爲什麼會有這種行爲?有沒有什麼辦法解決這一問題 ?

+0

應該只有一個實體映射到特定的表。 –

+0

@JBNizet:在某些情況下,您可以將多個映射/類指向同一個數據庫表,用於繼承等。 –

+0

繼承使用在根實體上定義的生成器,因此這不是真正有效的。一般而言,我認爲人們需要退一步思考*代理*鍵的全部目的。根據定義,這些價值觀應該沒有任何商業意義,那麼你爲什麼在乎呢? –

回答

4

org.hibernate.id.enhanced.TableGenerator定義了一個能夠同時生成多個值的表。聽起來像你試圖讓它從多個實體的單個值生成標識符。如果您想利用它,這由'segment_value'TableGenerator配置設置控制。

至於價值觀,沒有什麼可以「修復」。它沒有破碎。如果你想要不同的行爲,請配置不同的行爲。這由一個稱爲優化器的控制,由TableGenerator的「優化器」配置設置定義。本手冊全部涵蓋了這些內容:http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#mapping-declaration-id具體參見「5.1.2.3。增強標識符生成器」和「5.1.2.3.1。標識符生成器優化」部分。手冊沒有提到所有可用的優化器。聽起來像你想要的那個叫做「pooled-lo」,就像「彙集」一樣,但是存儲的是lo值而不是高值。

+0

這是一個配置錯誤。當然,你必須使用相同的值池來配置2件東西,才能很好地協同工作...... –

+0

不會與你爭論。你問......我回答了你要怎麼做。要麼接受,要麼離開它... –

1

這篇文章比較陳舊,但對於其他人可能會遇到同樣的問題。

正如Steve Ebersole所指出的那樣,您應該在您的案例中使用「合併優化器」優化器。 檢查你的休眠版本,應該是> = 4.3.11,因爲在以前的版本中有issue

爲了給出一些解釋,使用池優化器,存儲在數據庫中的值是下一個可用時間間隔的低值。

因此,如果最後一個實體的ID保持在[1; 10]中,則下一個可用間隔爲[11,20],並且存儲在數據庫中的值將爲11,就像您期待的那樣。

因此,如果你有另一個程序不使用hibernate,甚至沒有意識到在hibernate配置中定義的增量大小,它仍然能夠插入實體而不會破壞序列。

它所要做的就是自動獲取序列值並遞增它,然後使用值作爲要插入的新實體標識的retrieve(在「遞增」之前)。 在我們的示例中,爲了插入一行,它將更新序列值爲12,並添加ID爲11的新實體。 因此,當hibernate將在內存(10)中達到其當前間隔的最後一個id時,查詢數據庫並存儲值22以保持id爲[12; 21]的新時間間隔。