0

我有一个要求,我需要同时支持 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。

4

3 回答 3

2

有一个专门的发电机

<generator class="sequence-identity">
    <param name="sequence">OneTimeAccessToken_id_seq</param>
</generator>
于 2012-07-31T13:09:14.573 回答
0

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

于 2012-07-31T12:41:46.737 回答
0

我不会尝试在同一个 SessionFactory 中混合使用数据库方言。如果你有两个数据库要支持,你将不得不使用两种不同的 Hibernate 配置。这自然解决了 ID 生成冲突,因为您只需为 Oracle 域中的类与 Postgres 域中的类使用不同的生成器。

于 2012-08-06T15:25:34.093 回答