I've got a simple storefront app that has a few stateless EJBs that act as DAO objects, basically. The app also has a single stateful bean which acts as a session for the shopping cart, it's called ShoppingCartBean.
I've got it all working just fine but I'm not happy w/ the final checkout action where all order (entities) data is persisted and the SFSB is terminated w/ @Remove.
I want to make it transactional but I'm unclear how I should do this, really. I'm using CMT entirely, no BMT in any of this.
Each of the stateless beans declares an EntityManager and the methods there in use it to query/persist data...really straight-forward stuff.
Now, if I take my SFSB and declare an EntityManager in it...could I make the methods I call from the injected stateless beans transactional?
Here's an example of what I'm imagining:
@Stateful
//@Local(ShoppingCart.class)
public class ShoppingCartBean
implements Serializable, ShoppingCartLocal, ShoppingCartRemote
{
@PersistenceContext
private EntityManager em;
private Order order;
private Customer customer;
@EJB Authenticate authBean;
@EJB Orders orderBean;
public void completeOrder()
{
//begin transaction
this.em.getTransaction().begin();
//get Order in session
Order order = this.getOrder();
//Customer/User in session
Customer customer = order.getCustomer();
User user = customer.getUser();
//Address entities
Address billing = this.getBillingAddress();
Address shipping = this.getShippingAddress();
//persist User
this.authBean.saveUser(user);
//persist Customer
this.orderBean.saveCustomer(customer);
//commit transaction
this.em.getTransaction().commit();
}
}