【问题标题】:PersistenceException( No persistence provider for EntityManager) in tomcattomcat 中的 PersistenceException(EntityManager 没有持久性提供程序)
【发布时间】:2011-08-14 18:15:25
【问题描述】:

我正在尝试部署我在网上找到的a web app,它应该充当 jpql shell webapp 演示。 尝试在 tomcat 中部署和运行它,我创建了一个persistence.xml(在 src 目录中),如下所示

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
  <persistence-unit name="pu" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>jpql.Employee</class>
    <class>jpql.Job</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
      <property name="hibernate.connection.url" value="jdbc:postgresql://localhost/jpqldemodb"/>
      <property name="hibernate.connection.username" value="damon"/>
      <property name="hibernate.connection.password" value="damon"/>
      <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
    </properties>
  </persistence-unit>
</persistence>

EntityManager 工具是(从另一个站点借来的)

package jpql.utils;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.apache.log4j.Logger;

public class EntityManagerUtil {
    static Logger logger = Logger.getLogger(EntityManagerUtil.class);
    private static EntityManager em=null;

    public static EntityManager getInstance() {
      if ( em == null) {
        EntityManagerFactory emf;
        emf = Persistence.createEntityManagerFactory("pu");
        if(emf == null){
            logger.info("emf is null");
        }else{
            logger.info("emf is created"+emf);
        }
        em = emf.createEntityManager();
        logger.info("em is created="+em);
        return em;
      }
      else
        return em;
    }
}

war文件结构是

META-INF
WEB-INF----------classes
                 lib-----------hibernate3.jar
                 web.xml     |-hibernate-jpa-2.0-1.00.Final.jar
                              --hibernate-tools.jar etc..

query.jsp

它部署成功,并且 query.jsp 出现在欢迎页面。(在 jsp 中,像 EntityManager em = jpql.utils.EntityManagerUtil.getInstance(); 这样的调用发生在一个 scriptlet 中)。但是,当我点击提交按钮,我收到此错误

org.apache.jasper.JasperException: 在第 25 行处理 JSP 页面 /query.jsp 时发生异常

22:           if ( query == null || query.length() ==  0)
23:               return;
24: 
25:           EntityManager em = jpql.utils.EntityManagerUtil.getInstance();
26:           List lst = null;
27:           try {
28:             Query  qry = em.createQuery(query);


Stacktrace:
        org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

javax.persistence.PersistenceException: No Persistence provider for EntityManager named pu
    javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
    jpql.utils.EntityManagerUtil.getInstance(Unknown Source)
    org.apache.jsp.query_jsp._jspService(query_jsp.java:82)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

persistence.xml中提到的持久化提供者是org.hibernate.ejb.HibernatePersistence,在hibernate3.jar中有。是因为tomcat的一些错误吗?我用的是tomcat 6.0.29

如果有人能帮我解决这个问题,那就太好了

问候

达蒙

更新: 正如 Bozho 建议的那样,更新了构建文件以正确构建 war 文件

    ...
    <target name="makedirs">    
        <mkdir dir="${dir.build}"/>
        <mkdir dir="${dir.build}/META-INF"/>            
    </target>

    <target name="compile" depends="makedirs" description="Compile all source code">    
        <javac srcdir="${dir.src}" destdir="${dir.build}" includeAntRuntime="false" verbose="yes">    
            <classpath refid="compileclasspath"/>    
        </javac>                
        <copy file="${dir.src}/persistence.xml" todir="${dir.build}/META-INF"/>    
    ...    
</target>

    <target name="war" depends="compile">
        <war destfile="${dir.build}/${webapp.context.name}.war" webxml="${dir.resources}/web.xml">
        <classes dir="${dir.build}">                

        </classes>      
        ...
    </target>

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    正确的路径是WEB-INF/classes/META-INF/persistence.xml - 确保它在那里。

    【讨论】:

    • 我是WEB-INF/classes/META-INF/persistence.xml
    • 感谢您的建议..但我在战争任务中找不到将 xml 文件包含在 web-inf/meta-inf 中的元素。我分别尝试了 webinf 和 metainf 元素,但他们把xml 文件到 web-inf 或 meta-inf 目录中。原谅我的无知..
    • @axtavt 谢谢.. 我应该复制粘贴它,减少技术错误的可能性
    • 你能帮我完成蚂蚁战任务吗?如何在 WEB-INF/classes 中创建 META-INF 目录? 元素不支持嵌套的 elemet
    • xml 是什么意思?那是一个IDE吗?蚂蚁?在eclipse中,可以放在src/META-INF/persistence.xml中,应该妥善处理
    猜你喜欢
    • 2016-04-18
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多