Java EE(开放)JPA - 无法检索 EntityManagerFactory

标签 java jakarta-ee jpa glassfish openjpa

我正在使用以下命令设置一个 java EE 项目 (打开)JPA。我使用 glassfish 4.0 作为我的应用程序服务器,但似乎无法让持久性发挥作用。

我面临的问题似乎是一个相当普遍的问题,因为同一错误的答案和解决方案有很大不同,该错误似乎是由很多不同的条件引起的。我已经尝试了我找到的大部分解决方案,不幸的是没有效果。

我正在尝试将 EntityManager 注入(inject)我的 DAO 之一

@Singleton
@Stateless
public class UserDAOJPAImpl implements UserDAO
{

    @PersistenceContext(unitName = "pu")
    private EntityManager em;

persistence.xml 使用 openJPA 作为提供程序,并且应该连接到 Glassfish 中我的 JDBC 资源,该资源使用 MySQL。配置似乎是正确的,因为 ping 测试成功。

我的 persistence.xml 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">

    <persistence-unit name="pu" transaction-type="JTA">
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <jta-data-source>jdbc/Kwetter</jta-data-source>
        <class>kwetter.domain.Tweet</class>
        <class>kwetter.domain.User</class>
    </persistence-unit>
</persistence>

persistence.xml 文件位于 src/main/java/META-INF/persistence.xml

然而,一切似乎都注入(inject)得很好。当我开始使用 EntityManager 执行查询时,出现以下错误:

java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName pu
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.java:138)
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.doTxRequiredCheck(EntityManagerWrapper.java:158)
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.doTransactionScopedTxCheck(EntityManagerWrapper.java:151)
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.persist(EntityManagerWrapper.java:281)
    at kwetter.dao.UserDAOCollectionImpl.create(UserDAOCollectionImpl.java:39)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153)
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4695)
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:630)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:582)
    at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:46)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:582)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369)
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4667)
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4655)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212)
    ... 84 more
]]

我已多次检查所有设置,但似乎找不到此问题的原因。任何帮助将不胜感激。

最佳答案

正如 pL4Gu33 在评论中建议的那样,我的 persistence.xml 的位置似乎不正确。

我的 IDE (IntelliJ IDEA) 自动将 persistence.xml 文件放在 META-INF 文件夹下。但是,我需要在项目的资源文件夹下拥有 META-INF 文件夹。

更改 persistence.xml 文件的位置后加载 persistence.xml 文件:src/main/resources/META-INF/persistence.xml

关于Java EE(开放)JPA - 无法检索 EntityManagerFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22117377/

相关文章:

java - JDBC 将日期转换为 UTC

java - JPA 1.2 createQuery Where 子句条件

Spring Data JPA 将原生查询结果映射到非实体 POJO

java - 使用 JPA 关系查询时非法尝试取消引用集合

JPA EntityManager 为什么merge() 不管理实例?

java - 忽略 vim java 警告

java - Project Loom 早期访问 IDE

Java USSD 菜单树生成 - 如何

java - 何时将配置放在 file.properties 或 Jndi 中

spring - 您如何在 Spring 容器之外使用 Spring Data JPA?