【问题标题】:Java EE (Open)JPA - Unable to retrieve EntityManagerFactoryJava EE (Open)JPA - 无法检索 EntityManagerFactory
【发布时间】:2014-04-02 18:23:51
【问题描述】:

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

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

我正在尝试将 EntityManager 注入我的一个 DAO 中

@Singleton
@Stateless
public class UserDAOJPAImpl implements UserDAO
{

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

persistence.xml 使用 openJPA 作为提供程序,并且应该连接到我在 Glassfish 中使用 MySQL 的 JDBC 资源。配置似乎是正确的,因为 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 下

然而,一切似乎都注入得很好。当我开始使用 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
]]

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

【问题讨论】:

  • 你在使用 maven 吗?
  • 你的代码没问题。似乎persistence.xml 在一个错误的地方。当我转移我的 persistence.xml 时,我也会遇到同样的异常。

标签: java jakarta-ee jpa glassfish openjpa


【解决方案1】:

根据 cmets 中 pL4Gu33 的建议,我的 persistence.xml 的位置似乎不正确。

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

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

【讨论】:

    猜你喜欢
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 2015-02-27
    • 2015-04-13
    • 2016-05-15
    • 1970-01-01
    • 2013-07-28
    相关资源
    最近更新 更多