Czy istnieje sposób na zainicjowanie EntityManagerbez 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.xmlplik:
<persistence>
<persistence-unit name="[REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE]">
SOME_PROPERTIES
</persistence-unit>
</persistence>
W środowiskach Java EE elementy jta-data-sourcei non-jta-data-sourcesą 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.xmlwyglą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.xmlwyglą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.xmlplik 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_LOCALzakł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_LOCALmoż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ć EntityManagerz 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);