Entities as Local Interface Parameters Can Harm You
Let’s start with a short quiz. TxMergeBean is a SLSB that uses CMT and EntityManager. Assume the following local and remote business interfaces: public interface TxMergeCommon { void methodA(); void methodB(MeineEntity entity); } @Local public interface TxMergeLocal {} @Remote public interface TxMergeRemote {} and the following SLSB: @Stateless public class TxMergeBean implements TxMergeRemote, TxMergeLocal { @PersistenceContext private EntityManager em; @EJB private TxMergeLocal self; @Resource private SessionContext sctx; public void methodA() { MeineEntity entity = new MeineEntity("methodA"); em.persist(entity); self.methodB(entity); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void methodB(final MeineEntity entity) { entity.setName("methodB"); em.merge(entity); sctx.setRollbackOnly(); } } Assume that MeineEntity is properly defined and its only constructor parameter is saved as ’name’ attribute. ...