3

Oracle に移植する必要があるため、現在 SQL Server で動作しているアプリケーションに DAO レイヤーを導入しています。

Hibernate を使用してファクトリを作成 (または依存性注入を使用) して、展開構成に従って正しい DAO を選択したいと考えています。この場合のベストプラクティスは何ですか? hibernate.cfg.xml ファイルと *.hbm.xml ファイルが異なる 2 つのパッケージを用意し、工場で適切に選択する必要がありますか? 私の DAO が両方の DBMS で (あまり) 手間をかけずに正しく動作する可能性はありますか?

4

4 に答える 4

3

私はしばらく前にクライアントのためにこれを行いました-ファイルに設定されたプロパティに応じて展開時に、 Antを使用してproduction.propertiesファイル内を変更しました(任意のxmlトランスフォーマーを使用できます)。ただし、これは、Hibernate コードが両方の DB 間でシームレスである場合、つまり db 固有の関数呼び出しがない場合などにのみ機能します。HQL/JPAQL には、この点に関して.hibernate.dialectcfgUPPER(s)LENGTH(s)

db の実装が必然的に異なる必要がある場合は、@matt が提案したようなことをする必要があります。

于 2009-10-21T17:12:18.463 に答える
3

hbm.xmlテーブル名と列が 2 つの間で同じであると仮定すると、同じファイルを使用できるはずです。hibernate.cfg.xmlただし、Hibernate の方言を SQLServer から Oracle に変更する必要があるため、別の Hibernate 構成値 ( ) を指定する必要があります。

2 つの名前にわずかな違いがある場合は、マッピング ファイルの 2 つのセット (データベース サーバーごとに 1 つ) を作成し、これらを個別の JAR ( と など) にパッケージ化しyourproject-sqlserver-mappings.jaryourproject-oracle-mappings.jar状況に応じていずれかの JAR を使用してアプリケーションをデプロイします。環境。

于 2009-10-21T16:00:06.367 に答える
3

多くのデータベース (Oracle、Informix、SQL Server、MySQL) をサポートするアプリに取り組んできました。1 つの構成ファイルと 1 つのマッピング セットがあります。データベース接続には jndi を使用するため、アプリでさまざまな接続 URL を処理する必要はありません。SessionFactory を初期化すると、基礎となる接続からデータベースのタイプを推測するメソッドがあります。たとえば、JNDI 経由で手動で接続を取得してから、connection.getMetaData().getDatabaseProductName() を使用してデータベースが何であるかを調べます。コンテナ環境変数を使用して明示的に設定することもできます。次に、configuration.setProperty(Environment.DIALECT, deducedDialect) を使用して方言を設定し、SessionFactory を通常どおりに初期化します。

あなたが対処しなければならないいくつかのこと:

  • 主キーの生成。TableGenerator 戦略のカスタマイズされたバージョンを使用するため、テーブル名と次のキーの列を持つ 1 つのキー テーブルがあります。このようにして、すべてのデータベースは、Oracle のシーケンス、SQL Server のネイティブなどではなく、同じ戦略を使用できます。
  • データベース固有の機能。可能な限りそれらを避けます。Hibernate の方言は、最も一般的な方言を処理します。場合によっては、カスタム方言クラスに独自のものを追加する必要があります。たとえば、日付演算は非常に標準的ではないため、関数名を作成し、それを各データベースの方法にマップします。
  • スキーマ生成 - Hibernate スキーマ生成クラスを使用します。ダイアレクトと連携して、データベースの各タイプに適した DDL を作成し、データベースを強制的にマッピングに一致させます。各データベースのキーワードに注意する必要があります。たとえば、Oracle に USER テーブル (USERS は機能します) や MySQL に TRANSLATION テーブルを作成しないでください。
于 2009-10-21T18:46:06.730 に答える
3

ここに Oracle と SQLServer の違いをマッピングした表があります: http://psoug.org/reference/sqlserver.html

私の意見では、最大の落とし穴は次のとおりです。1) 日付。機能とメカニズムはまったく異なります。DBごとに異なるコードを使用する必要があります。2) キー生成 - Oracle と SQLServer は異なる仕組みを使用しており、独自のキー テーブルを使用して「ネイティブ」生成を完全に回避しようとすると、すべての「挿入」を完全にシリアル化しただけです。パフォーマンスが良くありません。3) 並行性/ロックは少し異なります。パフォーマンスに敏感なコードの部分は、おそらく DB ごとに異なります。4) Oracle では大文字と小文字が区別されますが、SQLServer では区別されません。あなたはそれに注意する必要があります。

他にもたくさんあります :) 2 つの DB で実行される SQL コードを記述するのは困難です。高速化は、ほとんど不可能に思える場合があります。

于 2009-10-22T03:10:08.940 に答える