Можно ли поделиться конфигурацией из файла persistence.xml? - PullRequest
3 голосов
/ 31 августа 2010

В моем файле persistence.xml настроена одна единица постоянства, но у меня есть две базы данных. Эти базы данных идентичны в отношении схемы. То, что я пытаюсь сделать, это:

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

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

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


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

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

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

1 Ответ

3 голосов
/ 01 сентября 2010

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

На самом деле, он просто работает (а второй экземпляр использует переопределенные свойства).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...