Java 使用ID生成器“;顺序;或;表HiLow";基于数据库

Java 使用ID生成器“;顺序;或;表HiLow";基于数据库,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我们使用的是Hibernate 3.2,由于依赖于遗留应用程序中使用的其他库,因此无法升级。目前,表的hibernate映射文件中正在使用“本机”id生成器。反过来,hibernate对Oracle使用“序列”,对MySQL使用“自动增量列”。由于应用程序生成了大量ID,所以在Oracle的情况下,为了获取下一个序列,数据库和应用程序之间的大量查询流会影响性能。我们希望在Oracle中使用HiLow,并继续在MySQL中使用“自动增量列” 问题是,我们应该如何定义映射文件,以便Hibernate

我们使用的是Hibernate 3.2,由于依赖于遗留应用程序中使用的其他库,因此无法升级。目前,表的hibernate映射文件中正在使用“本机”id生成器。反过来,hibernate对Oracle使用“序列”,对MySQL使用“自动增量列”。由于应用程序生成了大量ID,所以在Oracle的情况下,为了获取下一个序列,数据库和应用程序之间的大量查询流会影响性能。我们希望在Oracle中使用HiLow,并继续在MySQL中使用“自动增量列”


问题是,我们应该如何定义映射文件,以便Hibernate在底层数据库为Oracle时使用HiLow,在底层数据库为MySQL时使用“Auto_Increment column”?如果我们不能通过映射文件实现这一点,我们应该覆盖哪个类?

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

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

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

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

Customer.java

package org.myapps;

public class Customer {
    private long cid; // your primary key property
    ...
    // setters and getters
}
现在,您可以指示hibernate Id生成器使用hilo算法生成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>

高值
下一个值
1000
....
并使用增量生成器

<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-适用于oracle

2)mysql\u hibernate.cfg.xml-用于mysql

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

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

一个用于使用增量生成器的MySQL(MySQL\u Customer.hbm.xml

并将这些映射文件与其对应的xxx.cfg.xml文件进行映射

此外,您还需要定义两种实用工具方法来根据数据库为您加载这些配置


注意:这是我想到的,但是,这里认为是专家引用,您应该咨询有更多经验的人。

我们扩展了Oracle10g方言并覆盖了方法“supportsSequences()”以返回false。这种方式映射文件继续使用本机id生成器,配置为Oracle方言的支持序列返回false,Hibernate使用“TableHilgenerator”