【问题标题】:Using ID generator "Sequence" or "Table HiLow" based on database使用基于数据库的 ID 生成器“Sequence”或“Table HiLow”
【发布时间】:2014-10-15 03:29:56
【问题描述】:

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

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

【问题讨论】:

    标签: java hibernate hibernate-mapping


    【解决方案1】:

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

    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
    }
    

    现在,您可以指示休眠 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>
    

    并使用增量生成器

    <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)在这两种生成类型之间切换,那么在我看来,您需要定义两个休眠配置文件:

    1) oracle_hibernate.cfg.xml - 用于 Oracle

    2) mysql_hibernate.cfg.xml - 用于 MySQL

    每个实体都有两个版本的休眠映射文件:

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

    一个使用 increment 生成器的 MySQL (mysql_Customer.hbm.xml)

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

    您还需要定义两个实用程序方法来根据您的数据库为您加载这些配置。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2010-11-24
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-30
        • 1970-01-01
        • 1970-01-01
        • 2018-12-01
        相关资源
        最近更新 更多