Boa tarde,
Estou com uma duvida sobre o comportamento de uma entity manager do tipo extendida. Lá vai:
Pelo que entendi, quando injeto no meu ejb uma EntityManagerFactory e crio uma entity manager pelo EntityManagerFactory.createEntitymanager(), ele me devolve uma entity manager do tipo extendida, e com isso se eu qser que ela participe da transação JTA gerenciada pelo container, eu devo explicitamente executar o em.joinTransaction(), certo ??
Fiz o seguinte teste:
package br.com.r1.services;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import br.com.r1.interfaces.ProcessPaymentRemote;
import br.com.r1.interfaces.TravelAgentRemote;
import br.com.r1.model.Cabin;
import br.com.r1.model.Reservation;
@Stateless
public class TravelAgentBean implements TravelAgentRemote {
@PersistenceContext(unitName="titan")
private EntityManager manager;
@EJB
private ProcessPaymentRemote payment;
@Override
public void addCabin(Cabin cabin) {
manager.persist(cabin);
}
@Override
public Cabin findCabin(int id) {
return manager.find(Cabin.class, id);
}
@Override
public void createReservation(Long crediCardNumber, Cabin cabin) {
//Registrando pagamento
payment.processPayment(crediCardNumber);
if(crediCardNumber!=null && crediCardNumber % 2 == 0){
throw new RuntimeException();
}
Calendar evento = new GregorianCalendar();
evento.set(Calendar.DAY_OF_MONTH, 30);
evento.set(Calendar.MONTH, 10);
Reservation res = new Reservation();
res.setDataEvento(evento);
res.setShipId(cabin.getId());
//Criando reserva
manager.persist(res);
}
}
que utiliza o ejb :
package br.com.r1.services;
import java.util.Calendar;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import br.com.r1.interfaces.ProcessPaymentRemote;
import br.com.r1.model.Payment;
@Stateless
public class ProcessPaymentBean implements ProcessPaymentRemote{
@PersistenceUnit(unitName="titan")
private EntityManagerFactory factory;
@Override
public void processPayment(Long crediCardNumber) {
Payment pay = new Payment();
pay.setCrediCardNumber(crediCardNumber);
pay.setData(Calendar.getInstance());
EntityManager manager = factory.createEntityManager();
manager.persist(pay);
}
}
Simulei um erro soh pra ver se o que eu tinha entendido estava correto. Sempre que eu mandar um CreditCardNumer que for par ele gera uma exception.
Eu tinha entendido que por não inscrever a entity manager do ejb ProcessPaymentBean na transação JTA, ele iria gravar o persiste de ProcessPaymentBean e não o de TravelAgentBean, mas ele não está gravando nenhum dos dois.
Acho que não entendi direito o real objetivo do joinTransaction(). Se alguém puder dar uma força…
Obrigado