Comportamento EntityManager extendido

0 respostas
sunwebdeveloper

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

Criado 9 de maio de 2011
Respostas 0
Participantes 1