Java JPA与JTA之间存在类装入器问题

Java JPA与JTA之间存在类装入器问题,java,jpa,Java,Jpa,我使用的是JPA2.0、Eclipselink2.x和maven。这是我的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="h

我使用的是JPA2.0、Eclipselink2.x和maven。这是我的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="certifications" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/com/ni/ds_edata_soa_nontx</jta-data-source>
        <class>com.ni.apps.engineering.certification.entities.NicdsCliCertificationStg</class>
        <class>com.ni.apps.engineering.certification.entities.NicdsCliCertificationStgPK</class>
        <class>com.ni.apps.engineering.certification.entities.NicdsCliUpMapping</class>   
        <properties>                        
            <property name="javax.persistence.jdbc.password" value="ni"/>
            <!--property name="javax.persistence.jdbc.user" value="NI"/-->
            <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
            <property name="eclipselink.logging.level.sql" value="FINE"/>       
        </properties>       
    </persistence-unit>
</persistence>
这就是我实现它的方式

public class CertificationFacade extends AbstractFacade{

    /**
     * Gets the certifications for the paramenter upId
     * @param upId the upId
     * @return the certifications
     * @throws CertificationException
     */
    public List<NicdsCliCertificationStg> getCertificationsByUpId(String upId)
            throws CertificationException {
        String stringQuery = new StringBuilder(
                "select c from NicdsCliCertificationStg c, NicdsCliUpMapping d where c.id.contactsId = d.contactsId and d.profileId =")
                .append(upId).toString();
        try {
            TypedQuery<NicdsCliCertificationStg> query = getEntityManager().createQuery(stringQuery,
                    NicdsCliCertificationStg.class);            
            return query.getResultList();
        } catch (Exception e) {
            throw new CertificationException(
                    CertificationConstants.INTERNAL_ERROR_MESSAGE, e);
        }
    }
}

所以,这就是我修复它的方法

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import com.ni.apps.engineering.certification.controller.AbstractFacade;

public class ApplicationListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        AbstractFacade.closeFactory();
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {

    }

}
这样,每次我重新部署应用程序时,我都会确保我创建的工厂已关闭

-编辑- 为了说明这一点,在创建Listener类之后,我必须像下面这样将Listener添加到web.xml中

<listener>
    <listener-class>com.ni.apps.engineering.certification.filter.ApplicationListener</listener-class>
</listener>

com.ni.apps.engineering.certification.filter.ApplicationListener

closeFactory()在验证emf不为null后,只执行emf.close()

请发布stacktrace,并且CertificationFacade代码在post中重复。。。它缺少Dao代码,抱歉,刚刚注意到。在上面。看起来很奇怪,你调试过这个代码吗。。如果未在weblogic中部署,是否会发生此错误?我的意思是,您是否尝试使用基本的java main运行这段代码?我建议您这样做以减少错误范围整个应用程序部署到我客户的weblogic,而我没有访问数据库的权限。如果我在运行查询后执行emf.close(),一切都会正常工作,但正如您所说,这很奇怪。答案很简单,如果您不执行emf.close(),emf将永远不会关闭,在下一个请求中,将创建一个新的,因为您创建了CertificationFacade类的新实例。。。如果您需要一些类来帮助完成EntityManagerFactory的生命周期,请使用OpenSessionInViewFilter过滤器
java.lang.ClassCastException: com.ni.apps.engineering.certification.entities.NicdsCliCertificationStg
    at com.ni.apps.engineering.certification.dao.CertificationDAO.getCertificationByUpId(CertificationDAO.java:25)
    at com.ni.apps.engineering.certification.rest.implementation.CertificationService.getCertificationByUpId(CertificationService.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1511)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1442)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1382)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:717)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:821)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:27)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:57)
    at com.ni.apps.engineering.certification.filter.ConfigurableRepRestServletFilter.doFilter(ConfigurableRepRestServletFilter.java:139)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:57)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3730)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3696)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2273)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1490)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import com.ni.apps.engineering.certification.controller.AbstractFacade;

public class ApplicationListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        AbstractFacade.closeFactory();
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {

    }

}
<listener>
    <listener-class>com.ni.apps.engineering.certification.filter.ApplicationListener</listener-class>
</listener>