2012-07-27 81 views
0

我有一个需求,我需要同时支持Oracle和PostgreSQL。我有以下休眠映射 -Hibernate:针对Oracle和PostgreSQL的映射

<id name="id" type="java.lang.Integer"> 
    <column name="id" not-null="true" /> 
    <generator class="native"> 
     <param name="sequence">`OneTimeAccessToken_id_seq`</param> 
    </generator> 
</id> 
<property name="resource" type="java.lang.String"> 
    <column name="`res`" not-null="true" /> 
</property> 
<property name="expires" type="long"> 
    <column name="`expires`" not-null="true" /> 
</property> 

但是,这不适用于Oracle,因为它有反引号。如果我删除反引号,PostgreSQL会失败。关于如何为这两个数据库提供支持的任何输入。

我正在使用org.hibernate.dialect.Oracle10gDialect针对Oracle 11.2版本,那对不对?

我的问题是反引号,并没有使数据库的序列兼容。我已经实现了。我在hbm文件中使用了反引号来使PostgreSQL根据我指定的字符情况创建表/列。如果我删除反引号,PostgreSQL将所有内容翻译为小写。现在使用反引号,PostgreSQL一切正常,但是,它会引起Oracle说的问题它无法找到表或视图:“OneTimeAccessToken”。我正在尝试确定如何解决维护表/列名称案例的这一问题,并使其对Oracle起作用。

回答

2

有这个

<generator class="sequence-identity"> 
    <param name="sequence">OneTimeAccessToken_id_seq</param> 
</generator> 
+0

我知道生成器类。我的问题不在于生成器,我的问题是使得hbm文件不兼容以便与Oracle一起使用。如果我删除它,它会打破PostgreSQL。我知道方言应该处理它,但是,在我的情况下它不是。我不知道为什么,需要更多的指针进行调查。 – devang 2012-07-31 15:44:47

+0

写你自己的idgenerator,它继承sequencegenerator并根据方言改变序列名称 – Firo 2012-08-01 06:19:57

+0

顺便说一句,这听起来像一个Hibernate的bug。在这两种情况下,Hibernate都应该正确引用,你不应该插入你自己的引用。请提交一份Hibernate错误报告,序列生成器名称未正确引用。 – 2012-08-06 00:30:27

0

你好,我不知道你是否打开基于注释的配置,但它似乎在this的情况下工作。正如我所看到的,他们只是指定了没有任何引号的序列的名称,所以我希望这可以工作,我目前没有可用的PostgreSQL数据库(现在只是安装它),所以我无法运行我的应用程序与它并告诉你肯定,但再次这应该工作。至于你的第二个问题,你可以看到here是的使用Oracle10gDialect版本11应该是OK的。

+0

我没有搜索过,并得到说Oracle10gDialect罚款的链接。但是,我在回复时遇到问题。我不能移动到使用注释。我已经意识到序列的事情。 – devang 2012-07-31 15:46:47

0

我不会试图和相同的SessionFactory内混合数据库方言专门的发电机。如果你有两个支持的数据库,你将不得不使用两种不同的Hibernate配置。这自然会解决ID生成冲突,因为您只需使用不同的生成器来处理Oracle域中的类与Postgres域中的类。

+0

我解决了问题。为了解决ID生成问题,我不需要2种方言,它通过@Firo建议进行更改来解决。其次,为了解决反向问题,这是Liquibase DB版本工具的一个问题。必须扩展他们的Oracle数据库实现以覆盖他们的微不足道的功能,并且还要扩展OracleSnapshotGenerator实现以覆盖liquibase特定表的表名引用。 – devang 2012-08-06 16:06:47