Vraptor3: No Persistence provider for EntityManager named default [resolvido]

Fazendo uns testes com os novos componentes para JPA do vraptor, bati em um ponto: No Persistence provider for EntityManager named default.

Para esse teste estou usando um ambiente não J2EE (tomcat) e o projeto é um war normal). Coloquei no web.xml os dados conforme indicado em http://vraptor.caelum.com.br/documentacao/componentes-utilitarios-opcionais/. Porém estou em dúvida se o persistence.xml deve ficar dentro de /META-INF do contexto web ou dentro de /classes/META-INF (como é o padrão em aplicações J2EE).

Verifica o teu persistence-unit no persistence.xml

por convenção você deve ter um persistence-unit com name=“default”

<persistence-unit name="default">
...
</persistence-unit>

… Se você estiver usando o eclipse e o seu tipo de projeto for um dynamic web project

se você colocar a pasta META-INF dentro de uma source folder
ele se vira pra quando você exportar como um war o persistence fique no lugar correto

Cerjr, muito obrigado.

O META-INF que estou usando está no source folder. Usei assim por ser mais acostumado com J2EE. Estou usando Eclipse sim, Dynamic Web Project e rodando o Tomcat embeded.

Meu persistence está com o default. O engraçado é que se eu alterar o default para defaultXX ele dá o mesmo erro. A impressão que eu tenho é que ele não acha meu persistence.xml.

Abraços

oi garcia

deve mesmo ficar dentro do META-INF do classes (vraptor nao interfere nisso), entao basta jogar o META-INF dentro do src que o eclipse copia tudo que nao é .java diretamente pro classes.

erros comuns quando ele nao acha o persistence:

  • o eclipse por motivo de erro no projeto nao esta copiando o XML para o WEB-INF/classes/META-INF (verifique pelo sistema de diretorios do seu sistema operacional)
  • se for um war, por via das duvidas descompacte-o para ver se o xml esta no local correto
  • ter digitado persistenSe em vez de persistenCe .xml
  • estar usando tags erradas, ja que o persistence.xml nao obriga declarar o xsd

Paulo, verifiquei agora e está tudo certo.

  • O persistence.xml peguei de um projeto EJB meu, ou seja, não há erros.
  • Coloquei dentro do /src/META-INF conforme é no J2EE e você indicou.
  • O eclipse parece estar jogando tudo no lugar certo.

O que eu não tinha feito foi gerar um war. Gerei ele e está tudo certo também. Estou achando que é a falta de alguma lib. Meu nível de log está confuso pela minha quase nula experiência com o tomcat.

Como eu configuro o JUL no tomcat para FINEST? :slight_smile:

posta pra gente a stack inteira, o psersitence.xml inteiro, e o codigo que abre o EMF?

Eu já tive esse problema, com a mesma mensagem de erro. No meu caso, o que faltava era um JAR do Hibernate, no caso o hibernate-entitymanager.jar.

Dá uma checada nas dependências do seu framework ORM e vê se não faltou nada…

T+

[quote=Duron Maniac]Eu já tive esse problema, com a mesma mensagem de erro. No meu caso, o que faltava era um JAR do Hibernate, no caso o hibernate-entitymanager.jar.

Dá uma checada nas dependências do seu framework ORM e vê se não faltou nada…
[/quote]

duron tem toda razao!!! o erro nao é o que estamos falando, ele nao esta encontrando é o provider, nao a definicao do xml!

Caused by: javax.persistence.PersistenceException: No Persistence provider for EntityManager named default at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:56) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:34) at br.com.caelum.vraptor.util.jpa.EntityManagerFactoryCreator.create(EntityManagerFactoryCreator.java:39) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$ LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:297) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$ LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:250) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.post ProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:144) ... 115 more

Estou usando o vraptor 3.2 e o provider que já vem built-in no vraptor.

<context-param> <param-name>br.com.caelum.vraptor.provider</param-name> <param-value>br.com.caelum.vraptor.util.jpa.JPACustomProvider</param-value> </context-param>

[code]<?xml version="1.0" encoding="utf-8" ?>


org.hibernate.ejb.HibernatePersistence

	<properties>
		<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
		
		<property name="hibernate.connection.url" value="jdbc:hsqldb:mem:vr3" />
		<property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" />
		<property name="hibernate.connection.username" value="sa" />
		<property name="hibernate.connection.password" value="" />
		
		<property name="hibernate.hbm2ddl.auto" value="update" />
		<property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider" />
	</properties>
</persistence-unit>

[/code]

Revisei os jars e não achei nada que pudesse estar faltando. Na verdade usei uma cópia de um mesmo projeto que tenho que usa vraptor + ejb. Porém como nesse aqui estou apenas fazendo testes estou sem um appserver, apenas tomcat, e inclui as libs do j2ee que não vem no tomcat.

[quote=Duron Maniac]Eu já tive esse problema, com a mesma mensagem de erro. No meu caso, o que faltava era um JAR do Hibernate, no caso o hibernate-entitymanager.jar.

Dá uma checada nas dependências do seu framework ORM e vê se não faltou nada…

T+[/quote]

:oops: Ooops. Poxa, impressionante como que no meio de tantos jars a gente pode esquecer de um jar tão básico. Pouz, cag**a minha, hahahahha.

Abraços

Essa é fácil, garcia-jj. No meu caso pelo menos, baixei o Entity-Manager, copiei tudo que tava na pasta /lib, e esqueci de pegar o jar principal, que vem na raiz do .zip, hehehe

T+

Engraçado garcia-jj q por mais bobo q seja o problema ele acontece com várias pessoas, comigo tb aconteceu isto…hahaha !

Pelo menos fica registrado no forum caso mais alguem tenha o mesmo tipo de problema !

Pessoal, desculpa ressuscitar esse tópico mas é que estou com o mesmo problema que o amigo estava. Vi uma dica do Paulo Silveira falando sobre abrir o arquivo war do projeto e ver se o arquivo persistence.xml estava sendo jogado pra lá e no meu caso não está. A estrutura do projeto que uso é diferente, uso projeto Java Web com maven, primefaces, cdi e hibernate.

O problemão que estou enfrentando é quando mando persistir alguma coisa, que lança a exceção como se não tivesse configurado a unidade de persistência. Já tentei mudar a pasta META-INF (com o arquivo persistence.xml que fica dentro dela) para outros diretórios do projeto mas não adiantou, o caminho atual dela é: src/main/java/META-INF.

PS.: quando o arquivo war é gerado, abro ele para ver se dentro tem o arquivo persistence.xml e ele não está lá. Outra observação é que uso Netbeans.

Se alguém puder dar uma luz.
Este é o meu arquivo 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="MsPU">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/BANCO"/>
      <property name="javax.persistence.jdbc.user" value="postgres"/>
      <property name="javax.persistence.jdbc.password" value="admin"/>
      <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
    </properties>
  </persistence-unit>
</persistence>