休眠:使用增量和Oracle架构的ID生成器
我正在使用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”的属性,我希望它使用。
如何解决此问题?
您可以使用模式参数指定的发电机模式:
<generator class="increment">
<param name="schema">TEST</param>
</generator>
可悲的是,这不是很好的Hibernate文档中描述;你必须看看API javadoc才能找到答案。
这就是说,马克是正确的关于“增量”不是很有效 - 它也不是安全的集群环境。
如果休眠默认模式是OTHER_SCHEMA然后如果你不提供表的架构,然后它会自动添加默认
解决办法是,你必须添加一个架构,除了一个默认所有的表名。在这种情况下,如果将休眠默认设置为您的模式,则可能会更好。
像这样使用max(id)查看序列通常并不高效,特别是在Oracle中,序列完全用于此用途。
谢谢马克。我会在长时间使用序列来使应用程序变得坚固。将模式作为参数添加是一个简单的修复,说明它不是Hibernate的bug,并允许我在小应用程序中使用预期的逻辑。 – Krishna 2009-10-14 21:16:19
这对我有很大的帮助。谢谢。 – ozeray 2015-03-17 08:12:44