EntityManager injetado com @PersistenceContext não salva - JPA

6 respostas
saviobarr

Olá amigos,
Tenho um SessionBean no qual eu injeto um EntityManager com @PersistenceContext, porém quando dou um em.persist(Object) nada acontece. A entidade não é gravada no banco, mas não ocorre nenhuma exceção.
Trecho do código do SessionBean onde é injetado o EntityManager:

public class StatelessBeanCap7 implements StatelessBeanCap7Interface {

@PersistenceContext(unitName="scbcd")
           EntityManager manager;                         


           /**
             * criacao de pessoa, operacao JPA simples
           */

           public void criarPessoa(){
                   Pessoa pessoa = new Pessoa();
                   pessoa.setCpfCliente("[telefone removido]");
                   pessoa.setNomeCliente("Savio Barros");
                   manager.persist(pessoa);
           }


    }

Meu persistece.xml:

<?xml version="1.0" encoding="UTF-8"?>

org.hibernate.ejb.HibernatePersistence java:/SQLServerDS br.edu.savio.ejbpuro.entity.cap7.Pessoa


[]'s

Sávio Barros

6 Respostas

Javabuntu

exibe alguma exception?

L

O transação só será gerenciada pelo Container se a transação for JTA, fato. Você está declarando uma transação não-JTA, como pode ser visto nas seguintes linhas:

<persistence-unit name="scbcd" transaction-type="RESOURCE_LOCAL" > <non-jta-data-source>java:/SQLServerDS</non-jta-data-source>

Transação via JTA, possui as seguintes configurações:

<persistence-unit name="scbcd" transaction-type="JTA" > <jta-data-source>java:/SQLServerDS</jta-data-source>

JTA exige um servidor Java EE completo, como Glassfish, por exemplo (Tomcat está fora de cogitação), e você vai ter que configurar no seu servidor uma conexão ao banco compatível com JTA.

Sem JTA, as transações devem ser abertas e comitadas manualmente, assim:

public class StatelessBeanCap7 implements StatelessBeanCap7Interface {
  
  @PersistenceContext(unitName="scbcd")
  EntityManager manager;

  @Resource
  private UserTransaction userTransaction;
  
  /**
  * criacao de pessoa, operacao JPA simples
  */
  
  public void criarPessoa() {
    userTransaction.begin();
    Pessoa pessoa = new Pessoa();
    pessoa.setCpfCliente("[telefone removido]");
    pessoa.setNomeCliente("Savio Barros");
    manager.persist(pessoa);
    userTransaction.commit();
  }
}
saviobarr

Olá, não lança exception

saviobarr

Leonardo3001:
O transação só será gerenciada pelo Container se a transação for JTA, fato. Você está declarando uma transação não-JTA, como pode ser visto nas seguintes linhas:

<persistence-unit name="scbcd" transaction-type="RESOURCE_LOCAL" > <non-jta-data-source>java:/SQLServerDS</non-jta-data-source>

Transação via JTA, possui as seguintes configurações:

<persistence-unit name="scbcd" transaction-type="JTA" > <jta-data-source>java:/SQLServerDS</jta-data-source>

JTA exige um servidor Java EE completo, como Glassfish, por exemplo (Tomcat está fora de cogitação), e você vai ter que configurar no seu servidor uma conexão ao banco compatível com JTA.

Sem JTA, as transações devem ser abertas e comitadas manualmente, assim:

public class StatelessBeanCap7 implements StatelessBeanCap7Interface {
  
  @PersistenceContext(unitName="scbcd")
  EntityManager manager;

  @Resource
  private UserTransaction userTransaction;
  
  /**
  * criacao de pessoa, operacao JPA simples
  */
  
  public void criarPessoa() {
    userTransaction.begin();
    Pessoa pessoa = new Pessoa();
    pessoa.setCpfCliente("[telefone removido]");
    pessoa.setNomeCliente("Savio Barros");
    manager.persist(pessoa);
    userTransaction.commit();
  }
}


Seguinte, eu já havia tentado abrir e fechar transação manualmente, mas no momento do manager.getTransaction().beginTransaction() dá o erro:
09:54:18,265 FATAL [application] javax.ejb.EJBException: java.lang.IllegalStateException: Illegal to call this method from injected, managed EntityManager
javax.faces.el.EvaluationException: javax.ejb.EJBException: java.lang.IllegalStateException: Illegal to call this method from injected, managed EntityManager

[]'s

Sávio Barros

saviobarr

Olá Maracujá, e nos casos necessários usar CMT? Eu uso BMT, e quero entender bem CMT, já que estou estudando pra SCBCD
Fiz as seguintes modificações:

<persistence-unit name="scbcd" transaction-type="JTA" >
     <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:/SQLServerDS</jta-data-source>

e

@TransactionAttribute
	public void criarPessoa(){
		Pessoa pessoa = new Pessoa();
		pessoa.setCpfCliente("[telefone removido]");
		pessoa.setNomeCliente("Savio Barros");
		manager.persist(pessoa);
		manager.flush();
	}

Agora funcionou. Abração

saviobarr

Oi, estou estudando também pelo study guide do MK…

Abraços

Sávio Barros

Criado 7 de outubro de 2008
Ultima resposta 7 de out. de 2008
Respostas 6
Participantes 3