gpt4 book ai didi

java - tomcat 中的 PersistenceException(没有 EntityManager 的持久性提供程序)

转载 作者:行者123 更新时间:2023-12-01 16:38:10 25 4
gpt4 key购买 nike

我正在尝试部署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 util 是(从另一个站点借用的)

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>

最佳答案

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

关于java - tomcat 中的 PersistenceException(没有 EntityManager 的持久性提供程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7058728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com