Hibernate と Tomcat が提供する JPA を使用した webapp があります。DI フレームワークも、Spring も、Guice も、完全な Java EE アプリケーション サーバーもありません。
2 つの異なるデータベースに接続するには JPA が必要です。次のように最初のデータベースに接続します。
EntityManagerFactory emf = Persistence.createEntityManagerFactory("mydb");
[...]
EntityManager em = emf.createEntityManager();
また、persistence.xml で宣言された「mydb」持続性ユニットがあり、context.xml で宣言されたリソースに JNDI を介してリンクされています。ここまですべてが機能します。
ここで、別のデータベースに接続する必要があります。これを persistence.xml と context.xml に追加し、永続化ユニットに「mydb2」という名前を付けました。これで、次のように使用できると仮定します。
EntityManagerFactory emf2 = Persistence.createEntityManagerFactory("mydb2");
EntityManager em2 = emf2.createEntityManager();
Hibernate は、両方のデータベースでクラスとテーブルを検証するように構成されています。
<property name="hibernate.archive.autodetection" value="class, hbm"/>
<property name="hibernate.hbm2ddl.auto" value="validate"/>
persistence.xml で。ただし、webapp を実行/デバッグすると、Hibernate は mydb 上の mydb2 に属する @Entity クラスを検証しようとしますが、明らかに失敗します。ここで面白いのは、Hibernate 検証プロパティを「none」に設定すると、アプリケーションが正しく動作し、必要に応じて正しいデータベースに接続することです...
それぞれのデータベースに属するクラス/テーブルのみを Hibernate に検証させる方法はありますか?
編集: @Table アノテーションでカタログ名を指定することは可能ですが、私の場合、この webapp の複数のインスタンスが実稼働環境にあり、各インスタンスが異なるデータベースのペアに接続するため、これは良い解決策ではありません。生産に入る直前にソースコードに触れることを余儀なくされるのは悪いことです。