无法修复java.lang.IllegalStateException:无法检索unitName的EntityManagerFactory

jam*_*mes 17 java eclipse jsp servlets java-ee

我正在尝试通过创建项目来学习JSP和servlet.我的目标是暂时不关注JPA,ORM和持久性甚至EJB.所以,请不要告诉我阅读教程或书籍.不幸的是,我不应该使用SQL查询来与数据库进行交互.相反,我使用预先编写的JPA代码来管理持久性,同时我专注于jsp和servlet.

当我运行我的项目时,我收到错误 - java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName AffableBeanPU. 我的项目位于 - https://github.com/double-whammy/affablebean.git 下载为zip按钮位于右下角.

- 我的persistence.xml文件位于META-INF文件夹中.我再次检查并构建了我的项目.所以可以排除这个原因.

我用谷歌搜索,没有一个解决方案是有帮助的.我该如何解决这个错误?

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
Run Code Online (Sandbox Code Playgroud)

例外:

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...
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 16

/META-INF/persistence.xml必须在运行时类路径中的网络资源,而不是它.因此,您需要将其放在Java源文件夹中,而不是放在Web内容文件夹中.它persistence.xml与Web资源无关,而与Java bean无关.

向上移动:

MyProject
 |-- java (src folder)
 |    |-- controller
 |    |    `--ControllerServlet.java
 |    |-- entity
 |    |-- session
 |    `-- META-INF
 |         `-- persistence.xml <-- Here.
 `--WebContent
     `-- WEB-INF
          |-- view
          |    |-- category.jsp        
          |    `-- etc..
          `-- index.jsp
Run Code Online (Sandbox Code Playgroud)

这样构建将在/META-INF/persistence.xml内部生成适当的WAR结构/WEB-INF/classes.您似乎正在使用Eclipse,您也可以通过在项目属性中选择JPA facet来实现此目的.

在此输入图像描述

这样Eclipse就会persistence.xml在正确的位置生成一个.

在此输入图像描述


Rob*_*sen 5

您提到您persistence.xml的存在META-INF。如果您将此应用程序部署为WAR文件,则persistence.xml需要打包为

WEB-INF
 `- classes
     `- META-INF
         `- persistence.xml`
Run Code Online (Sandbox Code Playgroud)

根据JPA 2.0规范,第8.2持久性单元包装

持久性单元由persistence.xml文件定义。其META-INF目录包含persistence.xml文件的jar文件或目录称为持久性单元的根。在Java EE环境中,持久性单元的根必须为以下之一:

•EJB-JAR文件
•WAR文件的WEB-INF / classes目录
• WAR文件的WEB-INF / lib目录中
的jar文件
• EAR库目录中的jar文件•应用程序客户端jar文件

不需要将包含持久性单元的EJB-JAR或WAR文件打包到EAR中,除非该持久性单元除了包含在EJB-JAR或WAR中的持久性类之外还包含持久性类。


Ale*_*hev 2

因为您的项目结构不正确。为 ejb 和 Web 应用程序创建两个单独的部分,然后将它们打包到 EAR 中或使用 CDI。JPA(EntityManagerFactory 是其中的一部分)根本没有被应用程序的容器激活。

对于企业应用:

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

对于 CDI:

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

  • 简单来说 - 只需在 Netbeans/Eclipse 中创建新的企业项目并查看将生成什么。http://docs.oracle.com/javaee/5/tutorial/doc/figures/overview-applicationModule.gif (2认同)