我們都知道使用Hibernate時的默認行為@SequenceGenerator-它使實際數(shù)據(jù)庫序列增加一,將該值乘以50(默認allocationSize值)-然后將該值用作實體ID。這是錯誤的行為,并與說明以下內(nèi)容的規(guī)范沖突:distributionSize-(可選)從序列中分配序列號時要增加的數(shù)量。需要明確的是:我不關(guān)心生成的ID之間的差距。我關(guān)心與基礎(chǔ)數(shù)據(jù)庫序列不一致的 ID 。例如:任何其他應(yīng)用程序(例如,使用純JDBC)可能要在從序列獲得的ID下插入新行-但所有這些值可能已被Hibernate使用!瘋狂。有人知道任何解決此問題的方法(沒有設(shè)置allocationSize=1,從而降低性能)嗎?編輯:弄清楚。如果最后插入的記錄的ID = 1,則HB同時51, 52, 53...在其新實體BUT中使用值:數(shù)據(jù)庫中序列的值將設(shè)置為2。當其他應(yīng)用程序使用該序列時,很容易導致錯誤。 另一方面:規(guī)范(據(jù)我所知)說數(shù)據(jù)庫序列應(yīng)該設(shè)置為51,同時HB應(yīng)該使用范圍內(nèi)的值 2, 3 ... 50更新: 正如下面的史蒂夫·埃伯索爾(Steve Ebersole)所述:通過設(shè)置可以啟用我描述的行為(也是許多人中最直觀的行為)hibernate.id.new_generator_mappings=true。謝謝大家。更新2:對于將來的讀者,您可以在下面找到一個有效的示例。@Entity@Table(name = "users")public class User { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ") @SequenceGenerator(name = "USERS_SEQ", sequenceName = "SEQUENCE_USERS") private Long id;}persistence.xml<persistence-unit name="testPU"> <properties> <property name="hibernate.id.new_generator_mappings" value="true" /> </properties></persistence-unit>
3 回答

千巷貓影
TA貢獻1829條經(jīng)驗 獲得超7個贊
絕對清楚...您所描述的內(nèi)容與規(guī)范沒有任何沖突。該規(guī)范討論的是Hibernate分配給您的實體的值,而不是實際存儲在數(shù)據(jù)庫序列中的值。
但是,可以選擇要獲取的行為。首先看到我的答復:是否有一種方法可以使用JPA批注和Hibernate動態(tài)選擇@GeneratedValue策略? 這將為您提供基礎(chǔ)知識。只要您設(shè)置為使用該SequenceStyleGenerator,Hibernate就會使用SequenceStyleGenerator中allocationSize的“池優(yōu)化器”進行解釋。“池優(yōu)化器”用于允許在創(chuàng)建序列時使用“增量”選項的數(shù)據(jù)庫(并非所有支持序列的數(shù)據(jù)庫都支持增量)。無論如何,請閱讀那里的各種優(yōu)化器策略。
添加回答
舉報
0/150
提交
取消