2013-04-02 49 views
1

這是一個關於定製Hibernate SequenceGenerator的問題。JPA/Hibernate SequenceGeneator定製

我有一個應用程序(Spring 3.1/Hibernate 4)必須與Oracle和SQLServer的兩個舊數據庫一起工作。我遇到Id生成器的問題。

在我的實體中,我將ID生成器策略註釋爲AUTO,以便當它與Oracle一起工作時,默認情況下它會啓動SequenceGenerator,並且在與SQLServer一起使用時默認會啓動IdentityGenerator。它適用於SQLServer,沒有問題。但對於Oracle,hibernate使用硬編碼的「hibernate_sequence」作爲默認序列名稱。這造成了問題,因爲傳統的Oracle數據庫使用約定TableName +「_ SEQ」作爲每個表的序列名稱。

我設法通過更改Hibernate SequenceGenerator源代碼並構建自己的hibernate代碼庫來解決該問題。但是這不太可取,因爲我們在升級Hibernate時必須記住這一點。

我還嘗試編寫自己的ID生成器(並註釋了ID字段),它在SequenceGenerator/IDGenerator之間切換但失敗。在任何情況下,這都不是可取的方式,因爲這需要進一步深入JPA/Hibernate框架內部,這是我猶豫要做的。

我想寫的是我的CustomizedSequenceGenerator,並以某種方式覆蓋Hibernate通過配置使用的一個。但我可以找到「不知何故」。

有沒有人有這樣的經驗?

感謝, 西蒙

回答

0

您可以通過實現IdentifierGenerator接口&然後重寫它的generate方法創建自定義生成器。

然後你可以在實體中使用它來生成id。

@Id 
@GenericGenerator(name="TABLE_X_SEQ", strategy="com.package.TableXIdGenerator") 
@GeneratedValue(generator="TABLE_X_SEQ") 
+0

對不起,有點晚了。 – user902650

+0

不幸的是,您的解決方案僅適用於Oracle。我也需要它爲SQLServer工作。兩者都是遺留數據庫,我無法更改其架構。基本上我正在尋找解決方案,使用Entity批註的相同Jave代碼適用於兩個數據庫 - 理想情況下,框架將選擇現有的IdentityServer for SQLServer和自定義的SeqenceGenerator for Oracle。但是我無法用我的定製生成器替換現有的SequenceGenerator。我最終不得不直接修改現有的Hibernate SequenceGenerator並構建我自己的Hibernate jar文件,這是不太可取的。 – user902650

+0

@ user902650很高興找到解決方法。這裏你有自定義的生成器,不管數據庫如何,都會被調用,你可以根據當前的數據庫生成密鑰。你爲什麼使用戰略而不是上面提到的AUTO。 –