代码之家  ›  专栏  ›  技术社区  ›  whiskeysierra

是否可以从persistence.xml共享配置?

  •  3
  • whiskeysierra  · 技术社区  · 14 年前

    我在persistence.xml中配置了一个持久性单元,但我有两个数据库。关于模式,这些数据库是相同的。我想做的是:

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

    属性包含不同的连接设置(用户、密码、JDBC URL…)。
    实际上,我尝试过这样做,似乎Hibernate(我的JPA提供者)在第二次调用中返回相同的实例,而不考虑属性。

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


    我把它归结为与我以前想的不同的东西。上述呼叫返回的实体经理(和工厂)按预期工作,但 getDelegate() 似乎是问题所在。我需要让底层会话支持应用程序中直接依赖Hibernate API的遗留代码。我所做的是:

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

    但不知何故,即使在使用第二个数据库上的EntityManager时,我也会收到一个在主数据库上操作的会话。

    1 回复  |  直到 14 年前
        1
  •  3
  •   Pascal Thivent    14 年前

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

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

    推荐文章