Создайте JPA EntityManager без конфигурационного файла persistence.xml

Есть ли способ инициализировать EntityManager без определенной единицы персистентности? Можно ли дать все необходимые свойства для создания менеджера по объекту? Я должен создать EntityManager от заданных значений пользователя во времени выполнения. Обновление persistence.xml и перекомпиляция не является опцией.

Любая идея о том, как сделать это, больше, чем одобрена!

74
задан Martijn Pieters 17 November 2017 в 08:41
поделиться

1 ответ

Есть ли способ инициализировать Entitymanager без определенного блока настойчивости?

Вы должны определить , по меньшей мере, один блок настойчивости в Persistence.xml Дескриптор развертывания.

Можете ли вы дать все необходимые свойства для создания EntityManager ?

  • Атрибут ИМЯ требуется. Другие атрибуты и элементы необязательны. (Спецификация JPA). Таким образом, это должно быть более или менее вашим минимальным файлом Persistence.xml :
<persistence>
    <persistence-unit name="[REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE]">
        SOME_PROPERTIES
    </persistence-unit>
</persistence>

в средах Java EE, jta-data jta-data-data и не-jta-data- Источник элементы используются для уточнения Global JNDI Имя источника данных JTA и / или NO-JTA , который будет использоваться поставщиком постоянства.

Итак, если ваш целевой сервер приложений поддерживает JTA (JBOSS, WebSphere, Glassfish), ваш Spinistence.xml выглядит как:

<persistence>
    <persistence-unit name="[REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE]">
        <!--GLOBAL_JNDI_GOES_HERE-->
        <jta-data-source>jdbc/myDS</jta-data-source>
    </persistence-unit>
</persistence>

Если ваш целевой сервер приложений не поддерживает JTA (Tomcat), ваш Persistence.xml выглядит как:

<persistence>
    <persistence-unit name="[REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE]">
        <!--GLOBAL_JNDI_GOES_HERE-->
        <non-jta-data-source>jdbc/myDS</non-jta-data-source>
    </persistence-unit>
</persistence>

Если ваш источник данных не связан с глобальным JNDI (например, за пределами контейнера Java EE), поэтому вы обычно определяете провайдеру JPA, драйвер, URL, пользователь и Свойства пароля. Но Имя свойства зависит от провайдера JPA. Итак, для Hibernate как провайдер JPA, ваш Persistence.xml файл будет выглядеть:

<persistence>
    <persistence-unit name="[REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE]">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>br.com.persistence.SomeClass</class>
        <properties>
            <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.ClientDriver"/>
            <property name="hibernate.connection.url" value="jdbc:derby://localhost:1527/EmpServDB;create=true"/>
            <property name="hibernate.connection.username" value="APP"/>
            <property name="hibernate.connection.password" value="APP"/>
        </properties>
    </persistence-unit>
</persistence>

атрибут транзакции типа

в целом в средах Java EE, тип транзакции Resource_local Предполагается, что будет предоставлена ​​информация о данных не JTA. В среде Java EE, если этот элемент не указан, по умолчанию JTA по умолчанию. В среде Java SE, если этот элемент не указан, может быть принято значение по умолчанию Resource_Local .

  • Для обеспечения портативности приложения Java SE необходимо явному списку Управляемые классы настойчивости, которые включены в блок настойчивости (Спецификация JPA)

Мне нужно создать EntityManager от указанных значений пользователя во время выполнения

Так что используйте это:

Map addedOrOverridenProperties = new HashMap();

// Let's suppose we are using Hibernate as JPA provider
addedOrOverridenProperties.put("hibernate.show_sql", true);

Persistence.createEntityManagerFactory(<PERSISTENCE_UNIT_NAME_GOES_HERE>, addedOrOverridenProperties);
57
ответ дан 24 November 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: