Hibernate:使用增量和Oracle Schema的ID生成器

时间:2009-10-14 13:33:37

标签: oracle hibernate

我正在使用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”属性。

如何解决此问题?

2 个答案:

答案 0 :(得分:7)

可以使用架构参数为您的生成器指定架构:

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

可悲的是,这在Hibernate文档中没有很好地描述;你必须查看API javadoc才能找到答案。

那就是说,马克在“增量”方面做得不对,效率不高 - 在群集环境中也不安全。

答案 1 :(得分:0)

如果hibernate默认架构是OTHER_SCHEMA,那么如果你没有为表提供架构,那么它会自动添加默认的

解决方案是您必须为所有表名添加一个模式,但默认值除外。在这种情况下,如果将hibernate默认设置为模式,则可能会更好。

使用max(id)来查看序列通常不会有效,特别是在具有完全符合此用途的序列的Oracle中。