java - 使用基于数据库的 ID 生成器 "Sequence"或 "Table HiLow"

标签 java hibernate hibernate-mapping

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

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

最佳答案

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

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

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

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

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>

并使用增量生成器

<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_hibernate.cfg.xml - 用于 MySQL

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

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

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

并将这些映射文件映射到它们对应的xxx.cfg.xml文件。

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

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

关于java - 使用基于数据库的 ID 生成器 "Sequence"或 "Table HiLow",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26374025/

相关文章:

java - 如何动态设置LinearLayout的权重?

java - 淡入淡出 JSP 页面

java - 在 Hibernate 中需要在运行时将类映射到不同的数据库

java - 如何使用hibernate注释+ Spring MVC映射两个表(一对多)

java - 给定 View 类 [org.springframework.web.servlet.view.tiles3.TilesView] 不是 [org.springframework.web.servlet.view.AbstractUrlBasedView] 类型

java - 基于 JPA Criteria 的查询,一次与三个查询相交

java - JPA连接表查询

java - Hibernate 创建不需要的映射表

调用 setter 和 getter 时出现 Java : org. hibernate.PropertyAccessException

java - 为什么 Hibernate 要求列表索引可以为空?