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

无法修复java.lang.IllegalStateException:无法检索unitName的EntityManagerFactory,java,eclipse,jsp,jakarta-ee,servlets,Java,Eclipse,Jsp,Jakarta Ee,Servlets,我试图通过制作一个项目来学习JSP和servlet。我的目标不是专注于JPA、ORM和持久性 现在甚至可以使用EJB。所以,请不要告诉我去读关于这方面的教程或书。不幸的是,我不应该这样 使用SQL查询与数据库交互。相反,我使用预先编写的JPA代码来管理持久性 而我主要关注jsp和servlet 运行项目时,出现错误-java.lang.IllegalStateException:无法检索unitName AffableBeanPU的EntityManagerFactory。 我的项目位于- 下载

我试图通过制作一个项目来学习JSP和servlet。我的目标不是专注于JPA、ORM和持久性 现在甚至可以使用EJB。所以,请不要告诉我去读关于这方面的教程或书。不幸的是,我不应该这样 使用SQL查询与数据库交互。相反,我使用预先编写的JPA代码来管理持久性 而我主要关注jsp和servlet

运行项目时,出现错误-
java.lang.IllegalStateException:无法检索unitName AffableBeanPU的EntityManagerFactory。
我的项目位于- 下载时,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
例外情况:

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>

jdbc/aflablebean

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

对于企业应用程序:

对于CDI:


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

WEB-INF
 `- classes
     `- META-INF
         `- persistence.xml`
根据第8.2节《持久性装置包装》:

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

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

不要求EJB-JAR或WAR文件包含 除非持久化单元 除了包含在 EJB-JAR或WAR


/META-INF/persistence.xml
必须在运行时类路径中结束,而不是在web资源中结束。所以,您需要将它放在Java源文件夹中,而不是Web内容文件夹中。
persistence.xml
与web资源无关,而是与JavaBean相关

向上移动:

MyProject
|--java(src文件夹)
||——控制器
||`--ControllerServlet.java
||——实体
||——会议
|`--META-INF

|`--persistence.xml我在嵌入式Glassfish服务器上遇到了类似的问题,原因是:

java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName cis_ejbPU
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.java:132)
为了解决这个问题,我做了以下几点

1) 在pom.xml中添加以下依赖项

      <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>
4) 在下创建文件夹结构

src\test\glassfish\domains\domain1\config 
并复制下的glassfish domain.xml

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

我按照上述步骤解决了这个问题。

您的服务器上是否正确设置了Datasource jdbc/affablebean?这个问题可能与此有关。尝试只注入数据源,看看是否可以连接。@Gas-是的,数据源设置正确。实际上,我使用数据源在JSP中运行sql查询。在那之后,我应该用EJB代码替换SQL,这就是问题开始的时候。我想主要关注jsp和servlet,现在我不得不学习EJB,它几乎是一种过时的技术。您要将其部署到哪个servlet容器?@anon-我的容器是glassfish4Liberty,它是一个轻量级应用服务器,有点像Tomcat,但更易于管理,并具有许多可插入的功能,如JPA、JSF、,EJBLite等。根据您是使用Eclipse,您可以下载插件还是独立服务器。检查这些:您所说的“为ejb和web应用程序创建两个独立的部分,然后将它们打包到EAR或使用CDI”是什么意思?请告诉我什么是企业应用程序和CDI以及它们的区别。这些东西对我来说是新的。我编写代码的教程中没有提到这一点。我的项目结构是根据教程。不确定这是否是导致问题的原因。谢谢。为了简单起见,只需在Netbeans/Eclipse中创建新的企业项目,然后看看将生成什么。谢谢你的回答,巴卢斯。我没有再面对这个问题,因为我开始开发一个新系统。在新系统中,我疯狂地搜索,发现需要使用JPA facets。不确定这是否是我的项目成功的原因。没有重现错误。我克服了这个问题上的错误,还犯了许多其他严重的错误。我现在正在使用netbeans开发相同的代码,这是本教程的原始IDE。到目前为止,它工作得很好。
/META-INF/persistence.xml
必须在运行时类路径中结束,而不是在web资源中结束。您的问题是由web资源中的问题引起的。当使用JPA方面(或在正确的位置手动创建文件夹和过滤器)时,它最终会进入Java源文件夹,最终进入运行时类路径。我在项目中使用Intellij 2018和GlassFish 5(Paraya),我创建了另一个名为
resources
的文件夹,并将其放置在与
src
相同的层次结构级别上,我得到了相同的错误。我从参考资料文件夹中移动了
/META-INF/persistence.xml
,并将其作为@BalusC放置在
src
中,效果非常好。当然,这是在paraya服务器上进行了必要的配置之后(即,设置JDBC资源和连接池)。
src\test\glassfish\domains\domain1\config 
<glassfish server install> glassfish\domains\domain1\config  to src\test\glassfish\domains\domain1\config.