3

persistence.xml で永続化ユニットを 1 つ構成していますが、データベースが 2 つあります。これらのデータベースは、スキーマに関して同一です。私がやろうとしていることは次のとおりです。

Persistence.createEntityManagerFactory("unit", primaryProperties);
Persistence.createEntityManagerFactory("unit", secondaryProperties);

プロパティには、さまざまな接続設定 (ユーザー、パスワード、jdbc url など) が含まれています。
私はこれを実際に試してみましたが、プロパティを気にせずに、hibernate (私の jpa プロバイダー) が 2 番目の呼び出しで同じインスタンスを返すようです。

構成を 2 台目のユニットにコピーする必要がありますか?


今まで思っていたものとは違うものに釘付けになりました。上記の呼び出しによって返された EntityManagers (および Factory) は期待どおりに動作getDelegate()しますが、問題があるようです。休止状態の API に直接依存するアプリケーションでレガシー コードをサポートするには、基礎となるセッションを取得する必要があります。私がしたことは:

final Session session = (Session) manager.getDelegate();

しかし、どういうわけか、2番目のデータベースで動作するentitymanagerを使用している場合でも、1次データベースで動作するセッションを受け取ります。

4

1 に答える 1

3

これは奇妙です。のソースによるとHibernateProvider#createEntityManagerFactory、メソッドは新しいインスタンスを返します。

public EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) {
    Ejb3Configuration cfg = new Ejb3Configuration();
    Ejb3Configuration configured = cfg.configure( persistenceUnitName, properties );
    return configured != null ? configured.buildEntityManagerFactory() : null;
}

そして、私は間違いなく、このダミー テストで同じインスタンスを取得しません:

@Test
public void testCreateTwoDifferentEMF() {
    Map properties1 = new HashMap();
    EntityManagerFactory emf1 = Persistence.createEntityManagerFactory("MyPu", properties1);
    Map properties2 = new HashMap();
    properties2.put("javax.persistence.jdbc.user", "foo");
    EntityManagerFactory emf2 = Persistence.createEntityManagerFactory("MyPu", properties2);
    assertFalse(emf1 == emf2); //passes
}

実際、それは機能します (そして、2 番目のインスタンスはオーバーライドされたプロパティを使用しています)。

于 2010-08-31T21:10:25.837 に答える