2009-10-14 75 views
3

我正在使用Hiberbnate 3.1.3。我有一個映射如下,當我嘗試插入記錄到TEST_TABLE,我得到一個異常:'線程中的異常'主要「org.hibernate.exception.SQLGrammarException:無法獲取增量生成器的初始值'休眠:使用增量和Oracle架構的ID生成器

<class name="com.test.app.to.TestTable" table="TEST_TABLE" schema="TEST"> 
     <id name="testId" type="long"> 
      <column name="TEST_ID" precision="12" scale="0" /> 
      <generator class="increment"></generator> 
     </id> 
</class> 

我在cfg.xml中設置瞭如下的默認模式,因爲我需要使用OTHER_SCHEMA中的表以及我的應用程序。

<property name="hibernate.default_schema">OTHER_SCHEMA</property> 

在上述情況下,似乎使用TestTable的對象工作正常,並正確地使用「測試」模式是一個Hibernate錯誤的讀,但'<generator class="increment"></generator>'不使用「測試」模式,而是使用默認'OTHER_SCHEMA'獲取最大ID。爲最大ID生成的查詢全文如下:

Hibernate: select max(TEST_ID) from OTHER_SCHEMA.TEST_TABLE 

我不能指定用於發生器的架構和它不使用模式的類=「TEST」的屬性,我希望它使用。

如何解決此問題?

回答

7

可以使用模式參數指定的發電機模式:

<generator class="increment"> 
    <param name="schema">TEST</param> 
</generator> 

可悲的是,這不是很好的Hibernate文檔中描述;你必須看看API javadoc才能找到答案。

這就是說,馬克是正確的關於「增量」不是很有效 - 它也不是安全的集羣環境。

+0

這對我有很大的幫助。謝謝。 – ozeray 2015-03-17 08:12:44

0

如果休眠默認模式是OTHER_SCHEMA然後如果你不提供表的架構,然後它會自動添加默認

解決辦法是,你必須添加一個架構,除了一個默認所有的表名。在這種情況下,如果將休眠默認設置爲您的模式,則可能會更好。

像這樣使用max(id)查看序列通常並不高效,特別是在Oracle中,序列完全用於此用途。

+0

謝謝馬克。我會在長時間使用序列來使應用程序變得堅固。將模式作爲參數添加是一個簡單的修復,說明它不是Hibernate的bug,並允許我在小應用程序中使用預期的邏輯。 – Krishna 2009-10-14 21:16:19