JPA em um projeto WEB

9 respostas
F

Estou fazendo um projeto jpa em web, utilizando o eclipse wtp 3.3 e o mysql 5 e jpa para persistência de dados. A estrutura do projeto ficou assim:

LojaONLINE
                src
                WebContent
                       META-INF
                           persistence.xml

ao executar o projeto ocorre o seguinte erro:

javax.persistence.PersistenceException: No Persistence provider for EntityManager named pu1

at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)

at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)

at br.com.lojaonline.Command.BaseDao.(BaseDao.java:15)

at br.com.lojaonline.Action.ClienteAction.execute(ClienteAction.java:34)

at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)

at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)

at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)

at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)

at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)

at java.lang.Thread.run(Unknown Source)

o arquivo persistence está no projeto:

<?xml version="1.0" encoding="UTF-8"?>
 	<persistence 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"
   		version="1.0"> 
   		<persistence-unit name="pu1">		
			<provider>org.hibernate.ejb.HibernatePersistence</provider>
			<class>br.com.lojaonline.Form.ClienteForm</class>
			<properties>
				<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/sisracao"/>
				<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
				<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />						
				<property name="hibernate.connection.username" value="root" />
				<property name="hibernate.connection.password" value="admin" />
				<property name="hibernate.hbm2ddl.auto" value="update"/>
			</properties>
		</persistence-unit>
	</persistence>

e quando eu chamo o projeto ele parece não encontrar o persistence.xml, será que tem algum problema com a estrutura montada e não está conseguindo achar na própria pasta onde foi criado o projeto no META-INF?

eu chamo ele por esse trecho de código:

try{			
			ClienteForm cliente = (ClienteForm) form;					
			System.out.println(cliente.getNome());
			
			request.setAttribute("nome", cliente.getNome().toString());
			
			BaseDao<ClienteForm> dao = new BaseDao<ClienteForm>();
			
			ClienteForm cli = new ClienteForm();			
			cli.setNome("jpaweb");
									
			dao.create(cli);
		}catch(Exception ex){
			ex.printStackTrace();
			return mapping.findForward("failure");
		}
		return mapping.findForward("sucess");
	}


a classe dao chamada:
public class BaseDao<T> {

	private static EntityManagerFactory emf;
	private EntityManager em;
	private EntityTransaction tx;

	public BaseDao() {			
		emf = Persistence.createEntityManagerFactory("pu1");		
		em = emf.createEntityManager();		
		tx = em.getTransaction();	
	}

	public boolean create(T obj) {			
		em.getTransaction();		
		try {			
			tx.begin();
			em.persist(obj);
			em.getTransaction();
			tx.commit();
			em.close();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			em.getTransaction().rollback();
			return false;
		}
	}
}

Alguém tem idéia do que poderia ser?

9 Respostas

A

Seu arquivo persistence.xml está no lugar errado.
Você está assim:

LojaONLINE
    src
    WebContent
            META-INF
                persistence.xml

O correto seria:

LojaONLINE
    src
        META-INF
            persistence.xml
    WebContent
B

Hmmm…
alguem sabe uma boa referencia para relacionamentos entre classes ?
:roll:

B

Hmmm…
alguem sabe uma boa referencia para relacionamentos entre classes ?
:roll:

F

acdesouza:
Seu arquivo persistence.xml está no lugar errado.
Você está assim:

LojaONLINE
    src
    WebContent
            META-INF
                persistence.xml

O correto seria:

LojaONLINE src META-INF persistence.xml WebContent

olá acdesouza, grato pela dica, entretanto eu fiz isso e o projeto continua a não encontrar o arquivo persistence.xml (ele não acha o ), teria outra dica?

F

seufagner:
Errado. O META-INF fica no root mesmo.
O Container vai buscar as informações sobre o pesistence unit dentro dele, no persistence.xml

seufagner, então o projeto tem que ficar nessa estrutura:

LojaONLINE
     src
     WebContent
             META-INF
                 persistence.xml

se sim, por que a classe não estaria achando o persistence.xml (pu1)? Essa estrutura foi a própria que o wtp criou no projeto.

A
FoxMurder:
olá acdesouza, grato pela dica, entretanto eu fiz isso e o projeto continua a não encontrar o arquivo persistence.xml (ele não acha o <persistence-unit name="pu1">), teria outra dica?
Além de deixar as coisas no lugar que eu falei antes, retira este elemento:
&lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt;

O persistence.xml que eu tenho usado é assim:

&lt?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt
&lt;persistence 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"
	version="1.0"&gt;

	&lt;persistence-unit name="nomeSistema" transaction-type="RESOURCE_LOCAL"&gt;
		&lt;properties&gt;
			&lt;!-- Desenvolvimento --&gt;
			&lt;property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/nomeSistema" /&gt;
			&lt;property name="hibernate.connection.driver_class" value="org.postgresql.Driver" /&gt;
			&lt;property name="hibernate.connection.username" value="usuario" /&gt;
			&lt;property name="hibernate.connection.password" value="senha" /&gt;
			
			&lt;!-- Produção 
			&lt;property name="hibernate.connection.datasource" value="java:comp/env/jdbc/nomeSistema" /&gt;
			--&gt;

			&lt;property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /&gt;
			&lt;property name="hibernate.hbm2ddl.auto" value="update" /&gt;
			&lt;property name="hibernate.show_sql" value="true" /&gt;
			&lt;property name="hibernate.format_sql" value="true" /&gt;
			&lt;property name="hibernate.default_schema" value="nomeSistema"/&gt;
		&lt;/properties&gt;
	&lt;/persistence-unit&gt;
&lt;/persistence&gt;

Isso mesmo, sem a declaração do PersisteceProvider, nem das entidades. No seu caso coloque os dados do MySQL que você está usando.

S

Errado. O META-INF fica no root mesmo.
O Container vai buscar as informações sobre o pesistence unit dentro dele, no persistence.xml

S

bebad:
Hmmm…
alguem sabe uma boa referencia para relacionamentos entre classes ?
:roll:

Como sempre digo por aqui:
http://java.boot.by/scbcd5-guide/

:slight_smile:

S

Cara, no root (raíz) do JAR ou WAR ou EAR, o qual você faz o deploy…
Não interessa a estrutura dos diretórios… E sim como está gerando o arquivo de deploy

Criado 19 de agosto de 2007
Ultima resposta 20 de ago. de 2007
Respostas 9
Participantes 4