2009-10-14 76 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