2016-05-25 35 views
0

現在、アプリケーションでTapestry 5を使用しています。ここで、データソースはhibernate.cfg.xmlで設定されています。 実行時に非JNDIデータソースに動的にデータソースを変更したいと考えています。 私はプログラム的に次のコードを使用してそれを行うには達成:実行時にTapestry 5でHibernate設定を動的に設定する方法

Configuration configuration = new Configuration(); 
configuration.setProperty("hibernate.connection.driver_class", "org.postgresql.Driver"); 
configuration.setProperty("hibernate.connection.url", dbUrl + "?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory"); 
configuration.setProperty("hibernate.connection.username", username); 
configuration.setProperty("hibernate.connection.password", password); 
SessionFactory sf = configuration.buildSessionFactory(); 
Session newSession = sf.openSession(); 
newSession.clear(); 

これは動作します。このセッションを使用しているとき、私は正常に自分のデータソースにアクセスできます。 しかし、私はいくつかの点で

session.saveOrUpdate(entry); 

を呼び出すときHibernateはhibernate.cfg.xmlで設定されたデータソースを使用しようとします。この問題を解決するにはどのようなアイディアがありますか?

答えて

2

あなたはTapestry IOCの概念に精通していると思います。 HibernateSessionSourceサービス(org.apache.tapestry5.hibernate.HibernateSessionSource)をオーバーライドする必要があります。 HibernateConfigurationUpdaterサービスを作成して、オーバーライドしたHibernateSessionSourceImplのローカルバージョン(HibernateConfigurationUpdaterサービスへの参照をビルド中に設定する)を知ることができます。 HibernateConfigurationUpdater.changeConfiguration(コンフィグレーションコンフィグレーション)は、新しいコンフィグレーションを受け取ると、(あなたの)CustomHibernateSessionSourceImpl.setSessionFactory()を呼び出します。同期の問題を考える必要があります。また、動的構成が本当に必要であることを確認してください。マルチテナントでは十分ではありませんか? (少なくともJPAはマルチテナントを完全にサポートしていますが、唯一の違いは起動時にすべてのデータソースを知る必要があることです)。

関連する問題