【问题标题】:Hibernate: ID generator using increment and Oracle SchemaHibernate:使用增量和 Oracle 模式的 ID 生成器
【发布时间】:2010-12-06 16:19:09
【问题描述】:

我正在使用 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 错误,因为使用 TestTable 对象进行读取工作正常并正确使用“TEST”架构,但 '&lt;generator class="increment"&gt;&lt;/generator&gt;' 不使用“TEST”架构,而是使用默认的 ' OTHER_SCHEMA' 用于获取最大 ID。为最大 ID 生成的查询如下:

Hibernate: select max(TEST_ID) from OTHER_SCHEMA.TEST_TABLE

我无法为生成器指定架构,并且它没有使用我希望它使用的类的 schema="TEST" 属性。

如何解决这个问题?

【问题讨论】:

    标签: oracle hibernate


    【解决方案1】:

    如果休眠默认模式是 OTHER_SCHEMA,那么如果你没有为表提供模式,那么它将自动添加默认模式

    解决方案是您必须为所有表名添加一个模式,除了一个默认表名。在这种情况下,如果您将休眠默认设置为您的架构,您可能会更好。

    像这样使用 max(id) 来查看序列通常效率不高,尤其是在 Oracle 中,它有专门用于此用途的序列。

    【讨论】:

    • 谢谢马克。从长远来看,我将研究使用序列来使应用程序更坚固。添加模式作为参数是一个简单的修复,它澄清了它不是 Hibernate 错误,并允许我在一个小应用程序中使用预期的逻辑。
    【解决方案2】:

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

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

    遗憾的是,这在 Hibernate 文档中没有得到很好的描述;您必须查看API javadoc 才能找到答案。

    也就是说,关于“增量”效率不高的问题,Mark 是对的——它在集群环境中也不安全。

    【讨论】:

    • 这对我帮助很大。谢谢。
    猜你喜欢
    • 2015-12-14
    • 2015-03-29
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    相关资源
    最近更新 更多