我一个持久性单元在我的persistence.xml配置,但是我有两个数据库。这些数据库是相同的,对于架构。我所试图做的是:

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

属性包含不同的连接设置(用户名,密码,JDBC URL,...)。结果 其实,我尝试这样做,似乎休眠(我的JPA提供者)返回相同的情况下在第二个电话,没有考虑属性的照顾。

我是否需要将配置复制到第二单元?


我钉下来到不同的东西,比我以前的想法。该EntityManagers(和工厂)返回通过上述工作的呼吁符合市场预期,但getDelegate()似乎是问题。我需要让我的应用程序直接依赖于Hibernate的API底层会议,以支持传统的代码。我所做的是:

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

但不知何故我使用其中在所述第二操作一个EntityManager时接收主数据库上的会话的操作连。

有帮助吗?

解决方案

这是很奇怪。根据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
}

实际上,它只是工作(与第二个实例是使用重写的属性)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top