我们使用的是 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/