Persistence.createEntityManagerFactory() в Java EE игнорирует источник JTA

У меня есть прекрасно работающий клиент приложения, развернутый на сервере GlassFish v2 внутри уха с некоторыми EJB, сущностями и т. д. Я использую eclipselink.

В настоящее время у меня есть файл persistence.xml:

<persistence-unit name="mysource">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>jdbc/mysource</jta-data-source>
    <class>entities.one</class>
    <class>entities.two</class>
    ...
    <properties>
      <property name="eclipselink.target-server" value="SunAS9"/>
      <property name="eclipselink.logging.level" value="FINE"/>
    </properties>
</persistence-unit>

И это прекрасно работает, когда я ввожу EntityManager в EJB:

@PersistenceContext(unitName="mysource")
private EntityManager em;

Теперь у меня есть требование динамически переключать единицы хранения/базы данных. Я полагаю, что могу получить EntityManager программно:

em = Persistence.createEntityManagerFactory("mysource").createEntityManager();

но я получаю следующую ошибку:

Unable to acquire a connection from driver [null], user [null] and URL [null]

Даже «переопределение» javax.persistence.jtaDataSource на «jdbc/mysource» в Map и вызов createEntityManagerFactory("mysource", map) не имеет значения.

Что мне не хватает?


person Draemon    schedule 04.11.2009    source источник
comment
Это должно работать, и ваш файл persistence.xml выглядит правильно. Убедитесь, что в вашем пути к классам нет нескольких файлов persistence.xml.   -  person James    schedule 08.04.2013


Ответы (1)


Вы пытаетесь обойти контейнер с программным созданием диспетчера сущностей, и это означает, что вы, скорее всего, создадите источник данных, отличный от JTA (поскольку он находится вне контейнера, тип транзакции должен быть RESOURCE_LOCAL), поэтому ваша исходная конфигурация бесполезна.

Попробуйте внедрить диспетчер сущностей с другим свойством unitName или создать единицу сохранения типа транзакции RESOURCE_LOCAL.

person Tamas Mezei    schedule 13.11.2009
comment
Я пытаюсь сделать именно то, что делает аннотация, но в коде, чтобы я мог установить unitName программно. В основном я просто хочу запросить у контейнера менеджер сущностей для данного PU по имени. Если есть другой способ сделать это (то есть без createEntityManagerFactory), это нормально. - person Draemon; 13.11.2009