我们正在使用Hibernate 3.2,由于依赖于遗留应用程序中使用的其他库,因此无法升级。目前,"本地" id生成器正在用于表的hibernate映射文件中。反过来,hibernate使用" sequence" for Oracle和" Auto_Increment column"对于MySQL。由于应用程序在Oracle的情况下会产生大量的ID,因此要获取下一个序列,许多查询会在数据库和应用程序之间流动,从而影响性能。我们想使用HiLow for Oracle,并希望继续使用" Auto_Increment column"对于MySQL。
问题是,如何定义映射文件,以便Hibernate在底层数据库是Oracle和" Auto_Increment column"时使用HiLow。如果底层数据库是MySQL?如果我们无法通过映射文件实现这一目标,那么我们应该覆盖哪个类?
答案 0 :(得分:1)
Hibernate Core提供了各种内置的Simple主键生成器类,如:
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
}
现在,您可以使用 hilo 算法指示hibernate Id生成器生成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 - for Oracle
2)mysql_hibernate.cfg.xml - 适用于MySQL
以及每个实体的两个版本的hibernate映射文件:
一个用于Oracle( oracle_Customer.hbm.xml ),使用 hilo 生成器和
一个用于MySQL( mysql_Customer.hbm.xml ),使用增量生成器
并将这些映射文件与相应的 xxx.cfg.xml 文件映射。
此外,您需要定义两种实用程序方法,根据您的数据库为您加载这些配置。
注意:这就是我想出来的,但是,专家引用被视为此处,您应该咨询有更多经验的人。
答案 1 :(得分:0)
我们已经扩展了Oracle10gDialect并重写了方法&#34; supportsSequences()&#34; 以返回false。这种方式映射文件继续使用本机id生成器,并且如配置的Oracle方言为支持序列返回false,Hibernate使用&#34; TableHiLoGenerator&#34; 。