我正在使用Hiberbnate 3.1.3。我有一个映射如下,当我尝试将记录插入TEST_TABLE时,我得到一个异常:'线程中的异常“main”org.hibernate.exception.SQLGrammarException:无法获取增量生成器的初始值'
<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>
在上面的例子中,它似乎是一个Hibernate Bug,因为使用TestTable对象的读取工作正常并正确使用'TEST'模式,但'<generator class="increment"></generator>'
不使用'TEST'模式但使用默认'OTHER_SCHEMA'用于获取最大ID。为max ID生成的查询读取如下:
Hibernate: select max(TEST_ID) from OTHER_SCHEMA.TEST_TABLE
我无法为生成器指定架构,并且它没有使用我期望它使用的类的schema =“TEST”属性。
如何解决此问题?
答案 0 :(得分:7)
您可以使用架构参数为您的生成器指定架构:
<generator class="increment">
<param name="schema">TEST</param>
</generator>
可悲的是,这在Hibernate文档中没有很好地描述;你必须查看API javadoc才能找到答案。
那就是说,马克在“增量”方面做得不对,效率不高 - 在群集环境中也不安全。
答案 1 :(得分:0)
如果hibernate默认架构是OTHER_SCHEMA,那么如果你没有为表提供架构,那么它会自动添加默认的
解决方案是您必须为所有表名添加一个模式,但默认值除外。在这种情况下,如果将hibernate默认设置为模式,则可能会更好。
使用max(id)来查看序列通常不会有效,特别是在具有完全符合此用途的序列的Oracle中。