EntityManager injetado com @PersistenceContext não salva - JPA

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("83786816102");
                   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

exibe alguma exception?

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("83786816102");
    pessoa.setNomeCliente("Savio Barros");
    manager.persist(pessoa);
    userTransaction.commit();
  }
}

Olá, não lança exception

[quote=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("83786816102");
    pessoa.setNomeCliente("Savio Barros");
    manager.persist(pessoa);
    userTransaction.commit();
  }
}

[/quote]
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

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("37654116101");
		pessoa.setNomeCliente("Savio Barros");
		manager.persist(pessoa);
		manager.flush();
	}

Agora funcionou. Abração

1 curtida

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

Abraços

Sávio Barros