Mein EntityManager oder EntityManagerFactory liefern ständig null zurück

Rudolf

Bekanntes Mitglied
Meine persistence.xml

Java:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
	xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="default" transaction-type="JTA">
	<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<properties>
			<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
			<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/isqe" />
			<property name="hibernate.connection.username" value="root" />
			<property name="hibernate.connection.password" value="" />
			<property name="hibernate.connection.pool_size" value="1"/>
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
			<property name="hibernate.show_sql" value="true"/>
<!-- 			<property name="hibernate.hbm2ddl.auto" value="create-drop"/> -->
			<property name="hibernate.hbm2ddl.auto" value="update"/>
			<property name="hibernate.current_session_context_class" value="thread"/>
			<property name="hibernate.cache.provider_class" value="org.hibernate.cache.internal.NoCacheProvider"/>
		</properties>
	</persistence-unit>
</persistence>

Wenn ich in einer @ManagedBean eine Referenz benutze, die so aussieht:

Java:
	@PersistenceContext(unitName = "default")
	private EntityManager em;

dann kriege ich ständig null. Woran liegt das? ist meine persistence.xml falsch konfiguriert, oder gehören die Angaben in die server.xml von tomcat?
 
N

nillehammer

Gast
Nein, das passt schon so. Eine mögliche Ursache ist, dass die persistence.xml nicht am richtigen Ort liegt. Das hatte ich mal und hab dann diese Seite gefunden, wo das sehr gut aufgelistet ist: Java How To ...: Where to put persistence.xml in web app?

Was auch zu beachten ist, dass die Injection erst nach dem Konstruktor daran kommt. Du kannst also den em von innerhalb des Konstruktors noch nicht nutzen. (Nur, falls Du das evtl. gemacht haben solltest.)
 

Rudolf

Bekanntes Mitglied
Danke für die Hinweise.

Ich habe eine Mavenarchitektur. Das bedeutet ich habe einen Srcordner in src/main/java. Dort ist ein Ordner mit Namen META-INF und dort ist die persistence.xml. Ich nutze die persistence.xml mit Persistence.createEntityManagerFactory("unitName"); und mit der gewohnten Benutzung und es funzt. Ich gehe mal davon aus, dass die persistence.xml gefunden wird.

em wird weder im Konstruktor noch in einem preRenderView oder PostConstruct aufgerufen. Das kanns also auch nicht sein. Sonst Ideen?
 

JimPanse

Bekanntes Mitglied
Es fehlt die Angabe der JTA-Datasource d.h. wäre nicht schlecht noch zu Wissen was für einen Server du verwendest.
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
Oracle Technology Network for Java Developers
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="default" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:deineDS</jta-data-source>
<properties>
....
</properties>
</persistence-unit>
</persistence>
[/XML]
 

mvitz

Top Contributor
Du nutzt also einen reinen Tomcat? Der kann afaik überhaupt kein DI über @PersistenceContext(unitName = "default") durchführen.
 

Rudolf

Bekanntes Mitglied
ich nutze einen reinen tomcat, überlege später evtl auf glassfish umzusteigen, wenn das projekt fertig ist und ich es auf einen richtigen host deploye.

und was di und tomcat angeht. kann sein, habe aber einige tutorials im net gefunden, die etwas anderes behaupten. weiß jemand mehr?
 
N

nillehammer

Gast
Ich habe nochmal ein bischen rumgesurft. Lies Dir unter folgendem Link Accessing Databases from Web Applications - The Java EE 5 Tutorial mal den Abschnitt "Obtaining Access to an Entity Manager" durch. Dort ist es recht genau erklärt. Kurz zusammengefasst:
Injection setzt voraus, dass das worin injiziert werden soll, irgendwie gemanaged ist, deswegen:
- Injection eigentlich nur in fully blown JEE-Servern
- Aber auch Webanwendungen gibt es Container-Managed Gedöns (Managed Beans bei JSF, Servlets, Listener)
Grundsätzlich geht DI also auch im Tomcat.

Aber in dieser Umgebung muss man aufpassen. Der EntityManager ist nicht Threadsafe und kann deswegen nur in RequestScoped Beans per @PersistenceContext injiziert werden. In allen anderen Fällen ist zwingend die EntityManagerFactory per @PersistenceUnit zu injizieren. Das ist dann in Deiner Managed Bean zwar eine Zeile mehr Code, aber es dürfte Dein Problem lösen.
 

JimPanse

Bekanntes Mitglied
was fürn server? ich nutze mysql lokal.

MySQL ist eine Datenbank und kein Server und Apache Tomcat ein Servlet-Container der wiederrum keinen EJB-Container implementiert d.h. entweder apache-tomee oder openejb mit Tomcat verwenden ansonsten einen AS wie JBoss oder Glassfish u.s.w.

Soweit ich weiß gibt es noch keine EJB3.1 Lite impl. für den Tomcat obwohl es mal angedacht war New-Features-in-EJB-31:

The ability to add EJB support to a lightweight servlet container like Tomcat.
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben