Czy istnieje sposób na zainicjowanie EntityManager
bez zdefiniowanej jednostki trwałości?
W deskryptorze wdrażania należy zdefiniować co najmniej jedną jednostkę trwałości persistence.xml
.
Czy możesz podać wszystkie wymagane właściwości, aby utworzyć Entitymanager
?
- Atrybut nazwy jest wymagany. Pozostałe atrybuty i elementy są opcjonalne. (Specyfikacja JPA). Powinien to być mniej więcej twój minimalny
persistence.xml
plik:
<persistence>
<persistence-unit name="[REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE]">
SOME_PROPERTIES
</persistence-unit>
</persistence>
W środowiskach Java EE elementy jta-data-source
i non-jta-data-source
są używane do określenia globalnej nazwy JNDI źródła danych JTA i / lub innego źródła danych, które ma być używane przez dostawcę trwałości.
Jeśli więc twój docelowy serwer aplikacji obsługuje JTA (JBoss, Websphere, GlassFish), Twój persistence.xml
wygląd będzie wyglądał następująco:
<persistence>
<persistence-unit name="[REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE]">
<jta-data-source>jdbc/myDS</jta-data-source>
</persistence-unit>
</persistence>
Jeśli docelowy serwer aplikacji nie obsługuje JTA (Tomcat), Twój persistence.xml
wygląd wygląda następująco:
<persistence>
<persistence-unit name="[REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE]">
<non-jta-data-source>jdbc/myDS</non-jta-data-source>
</persistence-unit>
</persistence>
Jeśli źródło danych nie jest powiązane z globalnym JNDI (na przykład poza kontenerem Java EE), zwykle definiuje się dostawcę JPA, sterownik, adres URL, właściwości użytkownika i hasło. Ale nazwa właściwości zależy od dostawcy JPA. Tak więc dla Hibernate jako dostawcy JPA persistence.xml
plik będzie wyglądał następująco:
<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>
Atrybut typu transakcji
Ogólnie w środowiskach Java EE typ transakcji RESOURCE_LOCAL
zakłada, że zostanie dostarczone źródło danych inne niż JTA. W środowisku Java EE, jeśli ten element nie jest określony, wartością domyślną jest JTA. W środowisku Java SE, jeśli ten element nie jest określony, RESOURCE_LOCAL
można przyjąć wartość domyślną .
- Aby zapewnić przenośność aplikacji Java SE, konieczne jest jawne podanie zarządzanych klas trwałości, które są zawarte w jednostce trwałości (specyfikacja JPA)
Muszę utworzyć EntityManager
z wartości określonych przez użytkownika w czasie wykonywania
Więc użyj tego:
Map addedOrOverridenProperties = new HashMap();
addedOrOverridenProperties.put("hibernate.show_sql", true);
Persistence.createEntityManagerFactory(<PERSISTENCE_UNIT_NAME_GOES_HERE>, addedOrOverridenProperties);