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