0

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 の複数のインスタンスが実稼働環境にあり、各インスタンスが異なるデータベースのペアに接続するため、これは良い解決策ではありません。生産に入る直前にソースコードに触れることを余儀なくされるのは悪いことです。

4

1 に答える 1

0

@javax.persistence.Table アノテーションを使用すると、catalog パラメータを使用してデータベースを区別できます。

編集: 別の hibernate-cfg.xml ファイル (それらを db1-hibernate-cfg.xml および db2-hibernate-cfg.xml と呼びます) を定義してみてください。xml 要素で要素を使用して、そのファクトリに対応するエンティティを一覧表示します。JPA に対応する orm.xml でこれらを定義することもできます。

次に、Spring 構成で、どの hibernate-cfg (または orm.xml) がどの EntityManager にマップされるかを明示的に定義します。

Spring の LocalContainerEntityManagerFactoryBean を使用した例:

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitManager" ref="pum" />
    <property name="persistenceUnitName" value="my-pu" />
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.ejb.cfgfile">my-hibernate.cfg.xml</prop>
                            ... other configurations
                    </props>
 </bean>

個別の orm.xml ファイルを定義するルートに進む場合は、persistence-unit-manager で、エンティティ マネージャー ファクトリごとに個別の persistence.xml ファイルを定義します (たとえば、db1-persistence.xml と db2 など)。persistence.xml ファイルで、要素を使用して、対応する orm.xml ファイルを定義します。

これらのファイルのデフォルトの場所は、クラスパス相対です。

于 2013-02-08T21:23:23.607 に答える