3

私のプロジェクトでは、実行時にデータベースを切り替える必要があります。Hibernate を使用しようとしましたが、オブジェクトをデータベース内のテーブルにマップする必要がある場所に行き詰まりました。問題は、接頭辞の付いたいくつかのテーブルがあることです:documents2001、documents2002 ...理解したように、実行時にクラスをテーブルにマップできません。iBatis を使用してみましたが、問題は実行時にデータベースが変更されることです。iBatis では、これを行うのはかなり困難です。\

多分いくつかのアドバイス、私は何を使うべきですか?

私の要件:

  • 実行時に異なるデータベースに接続する機能
  • 実行時にテーブルを変更する機能 (クラスが Hibernate のようにテーブルにマップされている場合)。

更新: わかりました、説明します:
実行時に異なるデータベースに接続できるアプリケーションを作成する必要があります。アプリのユーザーは、接続するデータベースを選択できます。すべてのデータベースは同じ構造です。これに加えて、ユーザーはデータベース内のテーブルを切り替えることができます。テーブルは同じ構造です。

  • Hibernate を使用できないと仮定した理由: Hibernate では、クラスがテーブルにマップされているため、実行時にテーブルを変更できません。これにより、接続できるテーブルを選択できなくなります。
  • なぜ私はiBATISを使用できないと思いました。iBATIS では、実行時に別のデータベースに接続するのは非常に困難です。そのため、ユーザーは実行時に別のデータベースに接続できません。

多分私が使用できる別のツールがありますか?

4

3 に答える 3

12

Ibatisでは、動的テーブル名の操作は簡単です。次のような式を使用してください。

SELECT * FROM $tableName$

ここtableNameで、はパラメータクラスのプロパティです。

Hibernate(または任意のJPAプロバイダー)で動的テーブル名を操作することは、非現実的(または不可能)ではないにしても、非常に困難です。この質問は以前に出てきました。JPA:実行時にクラスに対応するテーブル名を指定するにはどうすればよいですか?を参照してください。。

Ibatisで動的データソースを操作するには、いくつかのコードを記述する必要がありますが、それほど多くはありません。基本的に、IbatissqlMapClientは、データソースと実行可能なクエリのリストを持つの概念を回避します。sqlMapClientデータベースごとに1つ作成し、それぞれが異なるデータソースを使用して、すべて同じクエリファイルを(SQLマップ構成に)含めるようにします。

DAOは、複数がsqlMapClients注入され、実行時に使用するものを選択するように記述できます。これはあなたが自分で書かなければならない部分ですが、それは簡単です。

これは、コンパイル時にデータベースを知っていることを前提としています。データベースが実行時までわからない場合、それは少し難しいです。それでも可能かもしれませんが、実行時に基本的にデータソースをからスワップした場合にIbatisがどのように反応するかはわかりませんsqlMapClient。それはうまくいくかもしれません、それは爆破するかもしれません。あなたはそれを試して見る必要があります。

Hibernateは、同じ原則に沿ってここでも機能する可能性があります。複数の永続性ユニットをDAOに注入し、実行時に適切なものを使用します。Hibernate(または任意のJPAプロバイダー)では、管理対象オブジェクトが正しい永続性ユニットに保管されていることを確認する必要があります。これが実際に悪夢に変わるのは簡単にわかります。

一般的なコメントの1つ:動的なテーブル名やデータベースのパスをたどることはお勧めできません。そのため、実際に何をしているのか、その理由を検討し、より適切な設計上の選択を行うことでこれを改善できるかどうかを自問してください。

于 2009-11-17T09:19:07.500 に答える
1

私はあなたの要件を完全には理解していませんが、これは可能性です:

HibernateとiBatisはどちらもデータソースから機能できるため、getConnection()が呼び出されるたびに異なる接続を返すjavax.sql.DataSourceの独自の実装を作成できます。

Hibernateでのデータソースの使用

于 2009-11-17T09:06:08.890 に答える
1

テーブルの構造は同じで、名前が異なるだけですか?

これは間違いなく iBATIS でマッピングできます。

SQL マップに次のようなものを含める必要があります。

<select id="selectAll" resultMap="result" parameterClass="myParameterClass">
    SELECT ColumnA, ColumnB FROM $tableName$
</select>

私があなたの質問を正しく理解していれば、問題は解決するはずです。

于 2009-11-17T08:50:27.777 に答える