0

しばらくの間、私を悩ませている一般的な設計上の質問があります。

ゴール:

  • フロント エンドに Vaadin を使用して Web アプリケーションを作成する
  • ユーザーは実行時にプロジェクトを作成できる必要があります。すべてのプロジェクトは同じ (ドメイン) モデルを使用しますが、データは異なります
  • すべてのプロジェクトのデータを分離する必要があります (異なるデータベースに)
  • ユーザーはログインしてプロジェクトを選択し、特定のデータベースにアクセスできます
  • 異なるユーザーが異なるプロジェクトで同時に作業できます
  • アプリケーションは、注釈とプログラムによる構成で Hibernate を使用します

現在の状況

  • 多くの場所での静的な HibernateUtil の使用 (getSessionFactory.getCurrentSession)
  • 現在の Application インスタンスを取得するための ThreadLocal を使用した Session-Per-View パターンの部分実装
  • ビュー レイヤーに直接アクセスできないロジック レイヤー:
    • いくつかの部分では、現在のセッションは静的な HibernateUtil を使用して取得されます
    • 他の場所では、コンストラクターを介してセッション マネージャーを設定します。次に、このセッション マネージャーが DAO に渡され、データ取得と操作のためのセッションが提供されます。
    • プロジェクトが作成されると、Hibernates create オプションを使用してデータベースを作成できます (将来的には、作成時に静的 ddl インポートに切り替えることができます)。

問題

ご想像のとおり、さまざまな問題があります。

  • セッションを取得するための sessionfactory への静的アクセスは、複数のプロジェクトでは機能しません。静的 HibernateUtil は同時に 1 つの (db)url しか運ぶことができず、セッションが混在するためです。
  • Logic Layer から SessionManager へのアクセスは適切ではありません (いくつかのコンストラクターを介して提供する必要があります)
  • 異なるアプローチの混合は醜いですが、目標はこれを正すことです

考え

  • 依存性注入を実装して、ロジック層でも正しい DAOFactory を提供します。Guice で試してみましたが、インスタンスが Injector を介して作成されていない場合は Null Pointer Exceptions が発生します (他の質問を参照してください)。したがって、機能しません。

たとえば、現在どのデータベースがロードされているかをロジックレイヤーが認識せずに、コードのどこにでもDAOファクトリーの正しいインスタンス(正しいセッション/データベースにアクセスできる)を挿入/使用できればいいのにと思います。したがって、ロジック層はセッション処理などを気にする必要はありません。どこからでも xyDAO.find(id) または同様の呼び出しを行い、正しいデータベースを取得したいだけです。また、ロジックの奥深くで 1 つのクラスだけが必要な場合、コンストラクターによって複数のクラスを介して SessionManager を渡すのは良くないと思います。

示された目標を達成するためにどのようなアプローチをとりますか?

誰かが助けてくれれば本当にありがたいです。追加情報が必要な場合はお知らせください。提供いたします。

4

1 に答える 1

0

要件と解決策を混同していませんか?

すべてのプロジェクトのデータを分離する必要があります (異なるデータベースに)

異なるデータベースを使用するという要件は本当にありますか?それとも、すべてのプロジェクトのデータを分離する必要があるだけですか?

異なるデータベースが絶対的な要件ではない場合は、user_id十分な数のテーブルに列を追加するだけで、すべてのユーザーに同じテーブルを使用しながら、この要件を満たすことができます。

このアプローチは、データを水平ではなく垂直に分割する言えます

利点はすぐに明らかになるはずです。突然、ソリューションが非常にシンプルになり、これは良いことです。

于 2011-06-16T03:59:29.353 に答える