Чи існує спосіб ініціалізації EntityManager
без визначеної одиниці збереження?
Ви повинні визначити принаймні одну одиницю стійкості в persistence.xml
дескрипторі розгортання.
Чи можете ви надати всі необхідні властивості для створення Entitymanager
?
- Потрібний атрибут name. Інші атрибути та елементи є необов’язковими. (Специфікація JPA). Отже, це повинен бути більш-менш ваш мінімальний
persistence.xml
файл:
<persistence>
<persistence-unit name="[REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE]">
SOME_PROPERTIES
</persistence-unit>
</persistence>
У середовищах Java EE елементи jta-data-source
and non-jta-data-source
використовуються для вказівки глобального імені JNDI JTA та / або джерела даних, що не є 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);