2009-11-06 23 views
4

我想在生產MySQL系統中爲主鍵使用GenerationType.IDENTITY。但對於本地開發和測試,我想使用HSQLDB。問題在於HSQLDB不支持GenerationType.IDENTITY(至少在Eclipselink中)。我試着設置了GenerationType.AUTO,它默認爲HSQLDB的TABLE,但不幸的是它對MySQL也是如此,這不是我想要的。有什麼方法可以在persistence.xml中覆蓋這個嗎?是否還有其他一些技巧我可以使用,以便每個環境都能做正確的事情?我沒有在XML中設置任何實體配置(全部在註釋中),我不想改變它,所以我正在尋找一種避免這種情況的方式。爲測試/生產支持不同的JPA GenerationTypes

回答

2

這裏的基本思想是使用一個自定義生成器,它可以根據元數據信息在標識和表(或者其他需要的其他策略)之間進行內部切換。

但是,使用標準JPA無法執行此操作。雖然@GeneratedValue註釋確實定義了generator參數,它使您能夠specify a custom generator它不提供任何寫入機制(只允許您使用內置的表/序列生成器)。

這取決於特定的JPA提供程序是否(不)實現此功能。關於如何定義自定義生成器的EclipseLink wiki has an example。您需要修改它以在內部創建TableSequence/NativeSequence實例,並根據session.getPlatform()在兩者之間切換。

聲明:我還沒有嘗試過使用EclipseLink的上述;不過,我在Hibernate中做了一些非常類似的事情。

1

HSQLDB顯然本身支持IDENTITY列(絕對在v1.8中),所以這是EclipseLink中的一個缺陷。例如,DataNucleus爲HSQLDB提供了IDENTITY支持。

正如您清楚地知道的那樣,指定使用XML對於跨數據存儲庫部署有好處。

+0

有趣。我會向Eclipselink人員提出問題。這肯定會讓事情變得更簡單。 – Tim 2009-11-09 16:27:19