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

Diskutiere Mein EntityManager oder EntityManagerFactory liefern ständig null zurück im Data Tier Forum; Meine persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"...

  1. Rudolf
    Rudolf Mitglied
    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 kostenlose Training weiter --> (hier klicken)
  3. nillehammer
    nillehammer Guest
    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. Rudolf
    Rudolf 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?
     
  5. JimPanse
    JimPanse Neues 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]
     
  6. Rudolf
    Rudolf Mitglied
    was fürn server? ich nutze mysql lokal.
     
  7. mvitz
    mvitz Aktives Mitglied
    Du nutzt also einen reinen Tomcat? Der kann afaik überhaupt kein DI über @PersistenceContext(unitName = "default") durchführen.
     
  8. Rudolf
    Rudolf 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?
     
  9. nillehammer
    nillehammer Guest
    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. JimPanse
    JimPanse Neues Mitglied
    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 lerne Java zu programmieren: --> Hier klicken, um mehr zu erfahren (Klick)
Die Seite wird geladen...

Mein EntityManager oder EntityManagerFactory liefern ständig null zurück - Ähnliche Themen

Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..?
Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? im Forum Allgemeine Java-Themen
Problem bei meinem Code
Problem bei meinem Code im Forum Java Basics - Anfänger-Themen
Wie kann ich mein Programm zu einer App umwandeln?
Wie kann ich mein Programm zu einer App umwandeln? im Forum Java Basics - Anfänger-Themen
Gemeinsames Projekt
Gemeinsames Projekt im Forum Codeschnipsel u. Projekte
Wie baue ich meine GUI am besten auf?
Wie baue ich meine GUI am besten auf? im Forum Hausaufgaben
Thema: Mein EntityManager oder EntityManagerFactory liefern ständig null zurück