我們都知道使用Hibernate時的默認行為@SequenceGenerator-它使實際數據庫序列增加一,將該值乘以50(默認allocationSize值)-然后將該值用作實體ID。這是錯誤的行為,并與說明以下內容的規范沖突:distributionSize-(可選)從序列中分配序列號時要增加的數量。需要明確的是:我不關心生成的ID之間的差距。我關心與基礎數據庫序列不一致的 ID 。例如:任何其他應用程序(例如,使用純JDBC)可能要在從序列獲得的ID下插入新行-但所有這些值可能已被Hibernate使用!瘋狂。有人知道任何解決此問題的方法(沒有設置allocationSize=1,從而降低性能)嗎?編輯:弄清楚。如果最后插入的記錄的ID = 1,則HB同時51, 52, 53...在其新實體BUT中使用值:數據庫中序列的值將設置為2。當其他應用程序使用該序列時,很容易導致錯誤。 另一方面:規范(據我所知)說數據庫序列應該設置為51,同時HB應該使用范圍內的值 2, 3 ... 50更新: 正如下面的史蒂夫·埃伯索爾(Steve Ebersole)所述:通過設置可以啟用我描述的行為(也是許多人中最直觀的行為)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條經驗 獲得超7個贊
絕對清楚...您所描述的內容與規范沒有任何沖突。該規范討論的是Hibernate分配給您的實體的值,而不是實際存儲在數據庫序列中的值。
但是,可以選擇要獲取的行為。首先看到我的答復:是否有一種方法可以使用JPA批注和Hibernate動態選擇@GeneratedValue策略? 這將為您提供基礎知識。只要您設置為使用該SequenceStyleGenerator,Hibernate就會使用SequenceStyleGenerator中allocationSize的“池優化器”進行解釋?!俺貎灮鳌庇糜谠试S在創建序列時使用“增量”選項的數據庫(并非所有支持序列的數據庫都支持增量)。無論如何,請閱讀那里的各種優化器策略。
添加回答
舉報
0/150
提交
取消
