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

Dieses Thema Mein EntityManager oder EntityManagerFactory liefern ständig null zurück im Forum "Data Tier" wurde erstellt von Rudolf, 11. Jan. 2013.

Thema: Mein EntityManager oder EntityManagerFactory liefern ständig null zurück Meine persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0"...

  1. Meine persistence.xml

    Code (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:

    Code (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?
     
  2. Vielleicht hilft dir das Java-Tutorial weiter. Hier klicken --> (Klick)
  3. 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.)
     
  4. 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?
     
  5. 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]
     
  6. was fürn server? ich nutze mysql lokal.
     
  7. Du nutzt also einen reinen Tomcat? Der kann afaik überhaupt kein DI über @PersistenceContext(unitName = "default") durchführen.
     
  8. 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?
     
  9. 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.
     
  10. 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:

     
    Zuletzt bearbeitet: 18. Jan. 2013
  11. Schau dir jetzt hier den Kurs an und lernen Java zu programmieren: --> Hier klicken, um mehr zu erfahren (Klick)