Java EE(Open)JPA - 无法检索EntityManagerFactory

时间:2014-03-01 16:59:45

标签: java java-ee jpa glassfish openjpa

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

我面临的问题似乎是一个相当普遍的问题,因为同一错误的答案和解决方案差别很大,错误似乎是由很多不同的条件造成的。我已经尝试了我发现的大部分解决方案,遗憾的是无济于事。

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

@Singleton
@Stateless
public class UserDAOJPAImpl implements UserDAO
{

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

persistence.xml使用openJPA作为提供程序,并且应该连接到使用MySQL的Glassfish中的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
]]

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

1 个答案:

答案 0 :(得分:0)

正如评论中提到的pL4Gu33,我的persistence.xml的位置似乎不正确。

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

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