package org.jberet.test.integration.jpa; import java.util.UUID; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.persistence.EntityManager; import javax.persistence.OptimisticLockException; import javax.persistence.PersistenceContext; import org.jboss.logging.Logger; @Stateless public class MyBean { private final static Logger LOGGER = Logger.getLogger(MyBean.class); @PersistenceContext private EntityManager entityManager; @EJB private MyBean myBean; public void createEntity(long id, String value) { MyEntity myEntity = new MyEntity(id, value); this.entityManager.persist(myEntity); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void nestedTransaction(long id) { MyEntity myEntity = this.entityManager.find(MyEntity.class, id); myEntity.setValue(UUID.randomUUID().toString()); } //@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void testLocking(long id) { MyEntity myEntity = this.entityManager.find(MyEntity.class, id); myEntity.setValue(UUID.randomUUID().toString()); LOGGER.debug("before nested transaction"); this.myBean.nestedTransaction(1); LOGGER.debug("after nested transaction"); try { this.entityManager.flush(); LOGGER.debug("after flush"); } catch (OptimisticLockException e) { LOGGER.debug("flush exception: " + e.getClass().getName()); } } public void main(long id) { try { this.myBean.testLocking(id); } catch (Exception e) { LOGGER.debug("expected exception: " + e.getClass().getName()); } } }