package com.acme.jpa; import java.math.BigDecimal; import java.util.Date; import javax.annotation.Resource; import javax.ejb.EJB; import javax.ejb.EJBContext; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; @Stateless public class DualRepositoryService { @EJB private GameRepository gameRepository; @EJB private InvoiceRepository invoiceRepository; @Resource private EJBContext ejbContext; public void succeedFirstFailSecondInTx() { succeedFirstFailSecondWithoutTx(); } @TransactionAttribute(TransactionAttributeType.NEVER) public void succeedFirstFailSecondWithoutTx() { performSucceedFirstFailSecond(); } public void insertBothThenRollbackInTx() { gameRepository.create(new Game("Super Mario Brothers"), true); invoiceRepository.create(new Invoice(1L, new BigDecimal(50), new Date()), true); ejbContext.setRollbackOnly(); } public long getGameCount() { return gameRepository.getRecordCount(); } public long getInvoiceCount() { return invoiceRepository.getRecordCount(); } public void purge() { gameRepository.purge(); invoiceRepository.purge(); } private void performSucceedFirstFailSecond() { gameRepository.create(new Game("Super Mario Brothers"), true); invoiceRepository.create(new Invoice(1L, new BigDecimal(200), new Date()), true); } }