Есть ли способ инициализировать 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-source
и non-jta-data-source
элементы используются для указания глобального имени JNDI в ССТ и / или источник данных , не JTA , который будет использоваться поставщиком сохранения состояния .
Итак, если ваш целевой сервер приложений поддерживает JTA (JBoss, Websphere, GlassFish), ваш persistence.xml
вид выглядит так:
<persistence>
<persistence-unit name="[REQUIRED_PERSISTENCE_UNIT_NAME_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]">
<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();
addedOrOverridenProperties.put("hibernate.show_sql", true);
Persistence.createEntityManagerFactory(<PERSISTENCE_UNIT_NAME_GOES_HERE>, addedOrOverridenProperties);