Injection de EntityManger

18 respostas
J

Pessoal, Bom dia.

Sei que tem vários tópios a respeito do assunto, porém não consegui uma solução para o meu problema.

Estou com problema na injeção da instancia do entityManager nos ManagedBeans através do @PersistnceContext.

Persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
	xmlns="http://java.sun.com/xml/ns/persistence">
	<persistence-unit name="catalogo">  
		 <provider>org.hibernate.ejb.HibernatePersistence</provider>	
		<properties>
			<!-- <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory" />  -->
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/catalogo" />
			<property name="javax.persistence.jdbc.user" value="root" />
			<property name="javax.persistence.jdbc.password" value="" />
		</properties>
	</persistence-unit>
</persistence>

UsuarioBean.java

@ManagedBean
public class UsuarioBean {
	
	/*	Dessa maneira não funciona, lança NullPointerException
	@PersistenceContext
	private EntityManager entityManager;
  */

	//Dessa forma funciona normalmente.
	EntityManagerFactory factory = Persistence.createEntityManagerFactory("catalogo");
	EntityManager entityManager = factory.createEntityManager();
	


	public Usuario usuario = new Usuario();
	public List<Usuario> usuarios;
	
	public void adiciona(){
		UsuarioRep urep = new UsuarioRep(this.entityManager);
		urep.adiciona(this.usuario);
		this.usuario = new Usuario();
		this.usuario = null;
	}
	public void remove(){
		UsuarioRep urep = new UsuarioRep(this.entityManager);
		urep.remove(this.usuario);
		this.usuario = null;
	}
	  public List<Usuario> getUsuarios() {  
		UsuarioRep urep = new UsuarioRep(entityManager);
			this.usuarios = urep.getUsuarios();
	        return this.usuarios;  
	    }  
	
	
	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}
	
}

18 Respostas

J

Em qual container você está testando? Qual a versão do JSF?

Pelo que eu me lembre, a injeção só só irá funcionar em um container EJB (JBoss, glassfish, Websphere, etc). Caso seja um Tomcat, não irá funcionar.

J

JSF 2.0 e Tomcat 7 .

Então ta explicado porque não funciona!!

Mais então, há alguma solução para fazer a injeção no Tomcat?

J

Jair, Obrigado pela ajuda…

Vou configurar o JBoss aqui e testar.

A

cara,

tem jeito sim usar Tomcat 7, para injetar o EntityManager, so que vai ter que usar EJB 3.1 ou Spring.

t+

H

Bem, ter jeito tem mas vc vai quebrar MVC ou DDD caso você esteja utilizando alguma coisa.

Pq você não injeta seu EntityManager em um DAO Stateless e aí sim, seu MB tem o DAO injetado? [=

J

Bom, agora estou aqui quebrando a cabeça para configurar o JBOSs…

Esta dando o seguinte erro 526 [main] ERROR org.hibernate.connection.DatasourceConnectionProvider - Could not find datasource: java:/catalogoDS

Mais assim que eu conseguir resolver esse problema eu posto o resultado.

J

Agora você está utilizando outro persistence.xml? Porque agora ele está buscando a conexão no DataSource no JBoss.

Duas uma:

  • Ou configura o persistence.xml para não usar o DS
  • Configura um DS no JBoss
J

Bom dia…

Jair, eu configurei o persistence.xml para usar o DS, porém ainda está ocorrendo um erro.

Por favor, confere se o meu persistence.xml está correto. Segue abaixo:

<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="catalogo" transaction-type="JTA" > 
	  <provider>org.hibernate.ejb.HibernatePersistence</provider>
	  <jta-data-source>java:catalogoDS</jta-data-source>
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<!-- 
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/catalogo" />
			<property name="javax.persistence.jdbc.user" value="root" />
			<property name="javax.persistence.jdbc.password" value="" />
			 -->
		</properties>
	</persistence-unit>
</persistence>

Abaixo o arquivo DS:

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>catalogoDS</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/catalogo</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password></password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
    <metadata>
       <type-mapping>mySQL</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>

O erro…

08:07:49,059 INFO [org.jboss.jpa.deployment.PersistenceUnitDeployment] Starting persistence unit persistence.unit:unitName=catalogo.war#catalogo 08:07:49,620 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] Error installing to Start: name=persistence.unit:unitName=catalogo.war#catalogo state=Create: java.lang.ClassCastException: org.hibernate.ejb.HibernatePersistence cannot be cast to javax.persistence.spi.PersistenceProvider

J

Olha na classe que você importou o EntityManager e tenha certeza que está usando o EntityManager da JPA
Pacote: javax.persistence

J

Os imports estão corretos.

Estou achando que é algum problema referente as libs que estou usando no meu projeto x Jboss.

Tem um post aqui no guj com o mesmo problema http://www.guj.com.br/java/101103-erro-em-jboss

J

Dá uma procurada no google sobre esse defeito. joga a string "java.lang.ClassCastException: org.hibernate.ejb.HibernatePersistence cannot be cast to javax.persistence.spi.PersistenceProvider " no search.

Tem bastante gente falando desse problema justamente com o JBoss…

H

Cara, isso pode ser conflito.

Você adicionou biblioteca em seu projeto sem ser as do JBoss?

J

Tinha algumas libs do hibernaite porem eu removi do projeto.

Agora ainda tenho no projeto as libs:

c3p0-0.9.1.jar
cssparser-0.9.5.jar
ehcache-1.5.0.jar
guava-r06.jar
jsf-api.jar
jsf-facelets.jar
jsf-impl.jar
log4j-1.2.15.jar
mysql-connector-java-5.0.8-bin.jar
servlet-api.jar
slf4j-api-1.5.8.jar
slf4j-log4j12-1.5.8.jar
standard.jar

Você acha que alguma das libs pode estar conflitando com as do Jboss?

J

Removi todas as libs de WEB-INF/lib e mesmo assim ocorreu o problema.

11:45:28,215 INFO  [org.jboss.jpa.deployment.PersistenceUnitDeployment] Starting persistence unit persistence.unit:unitName=catalogo.war#catalogo
11:45:28,959 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] Error installing to Start: name=persistence.unit:unitName=catalogo.war#catalogo state=Create: java.lang.ClassCastException: org.hibernate.ejb.HibernatePersistence cannot be cast to javax.persistence.spi.PersistenceProvider

Estou pensando em voltar com o tomcat e fazer da forma que você mencionou abaixo:

jakefrog:
Bem, ter jeito tem mas vc vai quebrar MVC ou DDD caso você esteja utilizando alguma coisa.

Pq você não injeta seu EntityManager em um DAO Stateless e aí sim, seu MB tem o DAO injetado? [=

H

Isso aí que eu citei eu sei que funciona com JBoss numa boa. Você utilizar o tomcat para EJB eu sei que você tem que dar umas voltas a +.

J

Bom, vou dar uma pesquisada sobre o Dao Stateless e vou tentar fazer dessa forma mesmo.

Assim que tiver um resultado eu volto a postar.

Obrigado pela ajuda.

J

Pessoal, Bom dia…

Consegui resolver meu problema de Hibernate com JBoss seguindo os exemplos dos artigos abaixo.

http://brunorota.wordpress.com/2011/05/20/exemplo-jpajbosseclipse/

http://brunorota.wordpress.com/2011/05/12/tutorial-ejbjbosseclipse/

Obrigado pela ajuda.

J

Bom dia.

Pessoal, estou com mais um dúvida aqui…

Apesar de deixar o Jboss gerenciar as transações do Hibenate, é necessário eu criar algum tipo de filtro para gerenciar abertura de sessão etc…?

Ou aplicando o código abaixo nos beans já basta …

@PersistenceContext
EntityManager em;
Criado 9 de novembro de 2011
Ultima resposta 18 de nov. de 2011
Respostas 18
Participantes 4