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