Вопрос

У меня есть один блок настойчивости, настроенный в моем сохранении .xml, но у меня есть две базы данных. Эти базы данных идентичны, касающиеся схемы. Что я пытаюсь сделать:

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

Свойства содержат разные настройки соединения (пользователь, пароль, пароль, URL JDBC, ...).
Я попробовал это на самом деле, и кажется, что Hibernate (мой провайдер JPA) возвращает тот же экземпляр во втором вызове, не заботясь о свойствах.

Нужно ли копировать конфигурацию на вторую единицу?


Я прибил его к чему-то другому, чем я думал раньше. Entitesmanagers (и фабрики) возвращаются вызовами выше работы, как и ожидалось, но getDelegate() кажется, проблема. Мне нужно получить базовую сессию для поддержки устаревшего кода в моем приложении, которое напрямую зависит от Hibernate API. Что я сделал:

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

Но каким-то образом я получаю сеанс, работающую в основной базе данных, даже при использовании EntiteManager, который работает на втором.

Это было полезно?

Решение

Это странно. Согласно источникам 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