2012-06-28 61 views
2

爲了測試我正在使用H2數據庫休眠ID生成器AUTO_INCREMENT在h2和MySQL在一個集羣

對於生產它是MySQL

我understrand既支持AUTO_INCREMENTmysql/h2),但它似乎是Hibernate不以這種方式工作。

identity支持MySQL。精細。
H2呢?我應該寫我自己的發電機還是......? (使用org.hibernate.id.IdentifierGenerator界面作爲文檔says)。

我必須有一個乾淨的&快速的方法來從數據庫本身獲取(順便說long類型)的ID,因爲的應用是在一個集羣(即幾個服務器INSERT到數據庫一次)。這就是爲什麼increment絕對不適合我。

謝謝!

+0

注意:使用XML映射。 – Poni

回答

3

你應該只註釋你需要使用@GeneratedValue生成值的id屬性。這將自動爲您正在使用的數據庫選擇適當的生成策略。有關更多詳細信息,請參閱GenerationType.AUTO

你的財產將是這樣的:

@Id 
@GeneratedValue 
private long id; 
+0

嗨,謝謝。對不起,但是:1)我正在使用XML映射。 2)我專門針對MySQL和H2的自動生成代碼的功能,而不是Hibernate提供的替代方法,如HiLow等。 – Poni

+0

好吧,使用@Generated值的XML替代方法。而默認的生成策略將使用數據庫自​​動生成代碼。 –

+0

希望它那麼簡單 - 「GenerationType.AUTO」的替代方案是什麼?你能看到它嗎(http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#d5e2502)?我不。 – Poni

2

使用本地發電機,例如

<id name="id" type="int"> 
    <column name="id_column" /> 
    <generator class="native" > 
     <param name="sequence">id_column_sequence</param> 
    </generator>    
</id> 

發電機與類native使用數據庫的最佳生成策略。在MySql的情況下,這是auto_increment,在Oracle的情況下,這是一個序列(對於H2,它也應該是一個序列,但我從來沒有嘗試過,因爲我不使用H2)。僅當發電機參數sequence有用時才使用,即對於MySql數據庫,該參數將被忽略,並且對於Oracle,它將被使用。

通過這種方式,您可以對不同的數據庫類型使用相同的映射文件(至少只要表和列名稱相同)。

+0

'native'不適用於h2。 – Poni

+0

爲什麼?你會得到一個特殊的錯誤信息嗎? 'native'也應該和H2一起工作。 – Johanna

+0

@Johanna我有一個類似的問題。你願意幫助我嗎?這裏是鏈接:http://stackoverflow.com/questions/25252541/generatedvalue-polymorphic-abstract-superclass-over-mysql/25268134#25268134 – CodeMed