Чи існує спосіб ініціалізації 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-sourceand 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);