I am trying to deploy a web app I found on net,which is supposed to act as a jpql shell webapp demo.
Trying to deploy and run it in tomcat,I created a persistence.xml (in the src directory) as below
<?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>
and the EntityManager util is (borrowed from another site)
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;
}
}
The war file structure is
META-INF
WEB-INF----------classes
lib-----------hibernate3.jar
web.xml |-hibernate-jpa-2.0-1.00.Final.jar
--hibernate-tools.jar etc..
query.jsp
It deploys successfully ,and the query.jsp comes up as welcome page.(In the jsp ,calls like EntityManager em = jpql.utils.EntityManagerUtil.getInstance(); happen inside a scriptlet).However,when I click on the submit button,I am getting this error
org.apache.jasper.JasperException: An exception occurred processing JSP page /query.jsp at line 25
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)
The persistence provider mentioned in persistence.xml is org.hibernate.ejb.HibernatePersistence, which is there in hibernate3.jar.Is it some error because of tomcat?I am using tomcat 6.0.29
If someone can help me solve this,it would be nice
regards
damon
update:
the build file updated to build the war file correctly ,as Bozho advised
...
<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>
The proper path is
WEB-INF/classes/META-INF/persistence.xml– make sure it is there.