wake-up-neo.net

Java.lang.IllegalStateException kann nicht behoben werden: EntityManagerFactory kann nicht für unitName abgerufen werden

Ich versuche, JSP und Servlets zu lernen, indem ich ein Projekt mache. Mein Ziel ist es, mich vorerst NICHT auf JPA, ORM und Persistenz oder gar EJB zu konzentrieren. Also bitte sag mir nicht, dass ich ein Tutorial oder ein Buch darüber lesen soll. Leider sollte ich keine SQL-Abfragen verwenden, um mit der Datenbank zu interagieren. Stattdessen habe ich vorab geschriebenen JPA-Code verwendet, um die Persistenz zu verwalten, während ich mich auf JSP und Servlets konzentriere.

Wenn ich mein Projekt starte, erhalte ich den Fehler - Java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName AffableBeanPU. Mein Projekt befindet sich unter - https://github.com/double-whammy/affablebean.git Download als Zip-Button befindet sich unten rechte Ecke.

Hinweis - Meine persistence.xml-Datei IS im META-INF-Ordner. Ich habe mein Projekt überprüft und erneut erstellt. Dieser Grund kann also ausgeschlossen werden.

Ich habe gegoogelt und keine der Lösungen hat geholfen. Wie behebe ich diesen Fehler?

MyProject
|
|__Java (src folder)
|    |
|    |__controller (package)
|    |   |__ControllerServlet.Java
|    |
|    |__entity (entity classes here) 
|    |__session (facade classes for each entity class)
|
|   
|__WebContent
    |
    |__WEB-INF
         |
         |__view
         |    |__category.jsp        
         |    |
         |    |etc...
         |
         |__index.jsp

Ausnahme:

Time|Info: Redirecting to /index.jsf
Time|Info: Admin Console: Initializing Session Attributes...
Time|Warning: EJB5184:A system exception occurred during an invocation on EJB CategoryFacade, 
method: public Java.util.List session.AbstractFacade.findAll()
Time|Warning: javax.ejb.EJBException
at com.Sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.Java:748)
at com.Sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.Java:698)
at com.Sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.Java:503)
at com.Sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.Java:4475)
at com.Sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.Java:2009)
at com.Sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.Java:1979)
at com.Sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.Java:220)
at com.Sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.Java:88)
at com.Sun.proxy.$Proxy193.findAll(Unknown Source)
at session.__EJB31_Generated__CategoryFacade__Intf____Bean__.findAll(Unknown Source)
at controller.ControllerServlet.init(ControllerServlet.Java:31)
at javax.servlet.GenericServlet.init(GenericServlet.Java:244)
at org.Apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.Java:1583)
at org.Apache.catalina.core.StandardWrapper.allocate(StandardWrapper.Java:1212)
etc ................................................... etc...
at Java.lang.Thread.run(Thread.Java:745) 

Caused by: Java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName AffableBeanPU
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.Java:138)
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper._getDelegate(EntityManagerWrapper.Java:171)
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper.getCriteriaBuilder(EntityManagerWrapper.Java:834)
at session.AbstractFacade.findAll(AbstractFacade.Java:41)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
etc ................................................... etc...
at com.Sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.Java:212)
... 33 more

Time|Severe: WebModule[/AffableBean]StandardWrapper.Throwable
javax.ejb.EJBException
at com.Sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.Java:748)
at com.Sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.Java:698)
at com.Sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.Java:503)
etc ................................................... etc...
at session.__EJB31_Generated__CategoryFacade__Intf____Bean__.findAll(Unknown Source)
at controller.ControllerServlet.init(ControllerServlet.Java:31)
at javax.servlet.GenericServlet.init(GenericServlet.Java:244)
at org.Apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.Java:1583)
at org.Apache.catalina.core.StandardWrapper.allocate(StandardWrapper.Java:1212)
etc ................................................... etc...
at Java.lang.Thread.run(Thread.Java:745)

Caused by: Java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName AffableBeanPU
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.Java:138)
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper._getDelegate(EntityManagerWrapper.Java:171)
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper.getCriteriaBuilder(EntityManagerWrapper.Java:834)
at session.AbstractFacade.findAll(AbstractFacade.Java:41)
etc ................................................... etc...
at com.Sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.Java:212)
... 33 more

Time|Warning: StandardWrapperValve[ControllerServlet]: Allocate exception for servlet ControllerServlet
Java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName AffableBeanPU
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.Java:138)
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper._getDelegate(EntityManagerWrapper.Java:171)
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper.getCriteriaBuilder(EntityManagerWrapper.Java:834)
at session.AbstractFacade.findAll(AbstractFacade.Java:41)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
etc ................................................... etc...

Persistence.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="http://Java.Sun.com/xml/ns/persistence http://Java.Sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="AffableBeanPU"
    transaction-type="JTA">
    <jta-data-source>jdbc/affablebean</jta-data-source>
    <properties>
        <property name="eclipselink.logging.level" value="FINEST" />
    </properties>
</persistence-unit>
</persistence>
15
james

Der /META-INF/persistence.xml muss im Laufzeitklassenpfad und nicht in den Webressourcen enden. Sie müssen es also im Java-Quellordner ablegen, nicht im Webinhaltsordner. Der persistence.xml bezieht sich nicht auf Webressourcen, sondern auf Java-Beans.

Verschiebe es nach oben:

MyProject
 |-- Java (src folder)
 |    |-- controller
 |    |    `--ControllerServlet.Java
 |    |-- entity
 |    |-- session
 |    `-- META-INF
 |         `-- persistence.xml <-- Here.
 `--WebContent
     `-- WEB-INF
          |-- view
          |    |-- category.jsp        
          |    `-- etc..
          `-- index.jsp

Auf diese Weise erzeugt der Build die richtige WAR-Struktur mit /META-INF/persistence.xml innerhalb von /WEB-INF/classes. Sie scheinen Eclipse zu verwenden. Sie können dies auch erreichen, indem Sie die JPA-Facette in den Projekteigenschaften auswählen.

enter image description here

Auf diese Weise generiert Eclipse einen persistence.xml an der richtigen Stelle.

enter image description here

15
BalusC

Sie erwähnen, dass Ihr persistence.xml in META-INF vorhanden ist. Wenn Sie diese Anwendung als WAR-Datei bereitstellen, muss Ihr persistence.xml als gepackt sein

WEB-INF
 `- classes
     `- META-INF
         `- persistence.xml`

Gemäß der JPA 2.0 Spezifikation , Abschnitt 8.2 Persistence Unit Packaging :

Eine Persistenzeinheit wird durch eine persistence.xml-Datei definiert. Die JAR-Datei oder das JAR-Verzeichnis, in dessen META-INF-Verzeichnis die Datei persistence.xml enthalten ist, wird als Stammverzeichnis der Persistenzeinheit bezeichnet. In Java EE-Umgebungen muss der Stamm einer Persistenzeinheit einer der folgenden sein:

• eine EJB-JAR-Datei
• das Verzeichnis WEB-INF/classes einer WAR-Datei
• eine JAR-Datei im Verzeichnis WEB-INF/lib einer WAR-Datei
• eine JAR-Datei im EAR-Bibliotheksverzeichnis
• eine Anwendungsclient-JAR-Datei

Es ist nicht erforderlich, dass eine EJB-JAR- oder WAR-Datei, die eine Persistenzeinheit enthält, in eine EAR gepackt wird, es sei denn, die Persistenzeinheit enthält zusätzlich zu den in der EJB-JAR oder WAR enthaltenen Persistenzklassen.

4

Weil Ihr Projekt eine falsche Struktur hat. Erstellen Sie zwei separate Teile für ejb und Webanwendung und packen Sie sie in EAR oder verwenden Sie CDI. JPA (zu dem EntityManagerFactory gehört) wird für Ihre Anwendung einfach nicht vom Container aktiviert.

Für Unternehmensanwendungen:

http://www.youtube.com/watch?v=32wpTh1TmY4

Für CDI:

http://www.hascode.com/2011/02/creating-a-sample-Java-ee-6-blog-application-with-jpa-ejb-cdi-jsf-and-primefaces-on-glassfish/

2
Alex Chernyshev

Ich hatte ein ähnliches Problem mit dem Embedded Glassfish-Server, verursacht durch:

Java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName cis_ejbPU
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.Java:132)

Um es zu lösen, habe ich DID die folgenden

1) Fügen Sie in der Datei pom.xml die folgenden Abhängigkeiten hinzu

      <dependency>
                <groupId>org.glassfish.extras</groupId>
                <artifactId>glassfish-embedded-all</artifactId>
                <version>3.2-b06</version>
                <scope>provided</scope>
            </dependency>

       <dependency>
           <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
                </dependency>

2) Richten Sie die HashMap-Eigenschaften für den eingebetteten Container ein

    File target = prepareModuleDirectory();
             Map<String, Object> properties = new HashMap<String, Object>();
             properties.put(EJBContainer.MODULES, target);

             properties.put("org.glassfish.ejb.embedded.glassfish.installation.root", "./src/test/glassfish/");
             properties.put("org.glassfish.ejb.embedded.glassfish.configuration.file", "./src/test/glassfish/domains/domain1/config/domain.xml");
    container = javax.ejb.embeddable.EJBContainer.createEJBContainer(properties);

3)

        private static final String MODULE_NAME = "embedded";
        private static final String TARGET_DIR = "target/" + MODULE_NAME;


    private static File prepareModuleDirectory() throws IOException {
        File result = new File(TARGET_DIR);
        FileUtils.copyDirectory(new File("target/classes"), result);
        FileUtils.copyFile(new File("target/test-classes/META-INF/persistence.xml"),
                new File(TARGET_DIR + "/META-INF/persistence.xml"));
        return result;
    }

4) Erstellen Sie die Ordnerstruktur unter

src\test\glassfish\domains\domain1\config 

und kopiere die glassfish domain.xml welche unter vorhanden ist

<glassfish server install> glassfish\domains\domain1\config  to src\test\glassfish\domains\domain1\config.

Ich habe die obigen Schritte ausgeführt, um das Problem zu beheben.

1
Madhu Pisipati