Injection de EntityManger

18 respostas
jv.nicocelli

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

Jair_Rillo_Junior

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.

jv.nicocelli

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?

jv.nicocelli

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+

Hebert_Coelho

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? [=

jv.nicocelli

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.

Jair_Rillo_Junior

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
jv.nicocelli

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

Jair_Rillo_Junior

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

jv.nicocelli

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

Jair_Rillo_Junior

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…

Hebert_Coelho

Cara, isso pode ser conflito.

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

jv.nicocelli

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?

jv.nicocelli

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? [=

Hebert_Coelho

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 +.

jv.nicocelli

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.

jv.nicocelli

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.

jv.nicocelli

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