しばらくの間、私を悩ませている一般的な設計上の質問があります。
ゴール:
- フロント エンドに 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 を渡すのは良くないと思います。
示された目標を達成するためにどのようなアプローチをとりますか?
誰かが助けてくれれば本当にありがたいです。追加情報が必要な場合はお知らせください。提供いたします。