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.Oracle10gDialectOracle 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

同じSessionFactory内でデータベースダイアレクトを混在させようとはしません。サポートするデータベースが2つある場合は、2つの異なるHibernate構成を使用する必要があります。これにより、OracleドメインのクラスとPostgresドメインのクラスに異なるジェネレーターを使用するため、ID生成の競合が自然に解決されます。

于 2012-08-06T15:25:34.093 に答える
0

こんにちは、あなたが注釈ベースの構成を受け入れているかどうかはわかりませんが、この場合はうまくいくようです。私が見ているように、彼らはシーケンスの名前を引用符なしで指定しただけなので、これが機能することを願っています.それと確かにあなたに言いますが、これもうまくいくはずです。ここでわかるように、2番目の質問については、バージョン11にOracle10gDialectを使用しても問題ないはずです。

于 2012-07-31T12:41:46.737 に答える