使用基于数据库的ID生成器“Sequence”或“Table HiLow”

时间:2014-10-15 03:29:57

标签: java hibernate hibernate-mapping

我们正在使用Hibernate 3.2,由于依赖于遗留应用程序中使用的其他库,因此无法升级。目前,"本地" id生成器正在用于表的hibernate映射文件中。反过来,hibernate使用" sequence" for Oracle和" Auto_Increment column"对于MySQL。由于应用程序在Oracle的情况下会产生大量的ID,因此要获取下一个序列,许多查询会在数据库和应用程序之间流动,从而影响性能。我们想使用HiLow for Oracle,并希望继续使用" Auto_Increment column"对于MySQL。

问题是,如何定义映射文件,以便Hibernate在底层数据库是Oracle和" Auto_Increment column"时使用HiLow。如果底层数据库是MySQL?如果我们无法通过映射文件实现这一目标,那么我们应该覆盖哪个类?

2 个答案:

答案 0 :(得分:1)

Hibernate Core提供了各种内置的Simple主键生成器类,如:

1)hilo ==> org.hibernate.id.TableHiloGenerator

2)增量==> org.hibernate.id.IncrementGenerator等。

例如,假设您有一个Customer类,如下所示:

<强> Customer.java

package org.myapps;

public class Customer {
    private long cid; // your primary key property
    ...
    // setters and getters
}

现在,您可以使用 hilo 算法指示hibernate Id生成器生成id: 的 Customer.hbm.xml

<hibernate-mapping>
    <class name="org.myapps.Customer" table="CUSTOMER">
        <id name="cid" type="int">
            <column name="CID" />
            <generator class="hilo">
                <param name="table">hi_value</param>
                <param name="column">next_value</param>
                <param name="max_lo">1000</param>
            </generator>
        </id>
    ....
</hibernate-mapping>

并使用增量生成器

<hibernate-mapping>
    <class name="org.myapps.Customer" table="CUSTOMER">
        <id name="cid" type="int">
            <column name="CID" />
            <generator class="increment" />
        </id>
    ....
</hibernate-mapping>

现在,如果您的问题是如何切换这两种生成类型,具体取决于您的底层数据库(Oracle或MySQL),那么在我看来,您需要定义两个hibernate配置文件:

1)oracle_hibernate.cfg.xml - for Oracle

2)mysql_hibernate.cfg.xml - 适用于MySQL

以及每个实体的两个版本的hibernate映射文件:

一个用于Oracle( oracle_Customer.hbm.xml ),使用 hilo 生成器和

一个用于MySQL( mysql_Customer.hbm.xml ),使用增量生成器

并将这些映射文件与相应的 xxx.cfg.xml 文件映射。

此外,您需要定义两种实用程序方法,根据您的数据库为您加载这些配置。

注意:这就是我想出来的,但是,专家引用被视为此处,您应该咨询有更多经验的人。

答案 1 :(得分:0)

我们已经扩展了Oracle10gDialect并重写了方法&#34; supportsSequences()&#34; 以返回false。这种方式映射文件继续使用本机id生成器,并且如配置的Oracle方言为支持序列返回false,Hibernate使用&#34; TableHiLoGenerator&#34;