[
https://issues.apache.org/jira/browse/OPENEJB-2122?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15016692#comment-15016692
]
Pascal Knüppel commented on OPENEJB-2122:
-----------------------------------------
I somehow do not get it working on my side. I have also another workflow than
you. But that is my problem. Thank you for your support so far.
But if interested, this is my test environment in dependence of the previous
example above:
{code:title=OpenEjbtest.java|borderStyle=solid}
public abstract class OpenEjbTest {
protected Context initialContext;
@EJB
protected OpenEjbTransactionCaller transactionCaller;
@BeforeClass
public static void addJpa2_1Support() {
EntityManagerProducer.entityManagerType =
EntityManagerProducer.EntityManagerType.OPENEJBTEST;
}
@Before
public void setUp() throws NamingException {
Properties p = new Properties();
p.put("log4j.rootLogger", "debug,C");
p.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.openejb.client.LocalInitialContextFactory");
initialContext = new InitialContext(p);
initialContext.bind("inject", this);
}
@After
public void cleanUp() throws NamingException {
initialContext.unbind("inject");
initialContext.close();
}
}
{code}
{code:title=EntityManagerProducer .java|borderStyle=solid}
public class EntityManagerProducer {
public static final String oracleEntityManagerName = "oracleEntityManager";
public static final String navisionEntityManagerName =
"navisionEntityManager";
public enum EntityManagerType {
OPENEJBTEST, SERVER
}
public static EntityManagerType entityManagerType =
EntityManagerType.SERVER;
@PersistenceContext(unitName = DBDefinitions.ORACLE_PERSISTENCE_UNIT)
protected EntityManager oracleEntityManager;
@PersistenceContext(unitName = DBDefinitions.NAVISION_PERSISTENCE_UNIT)
protected EntityManager navisionEntityManager;
@Produces
@RequestScoped
@Named(oracleEntityManagerName)
public EntityManager oracleEntityManager() {
switch (entityManagerType) {
case SERVER:
return oracleEntityManager;
case OPENEJBTEST:
// adding JPA 2.1 support
oracleEntityManager =
oracleEntityManager.unwrap(JpaEntityManager.class);
return oracleEntityManager;
}
return null;
}
@Produces
@RequestScoped
@Named(navisionEntityManagerName)
public EntityManager navisionEntityManager() {
switch (entityManagerType) {
case SERVER:
return navisionEntityManager;
case OPENEJBTEST:
// adding JPA 2.1 support
navisionEntityManager =
navisionEntityManager.unwrap(JpaEntityManager.class);
return navisionEntityManager;
}
return null;
}
}
{code}
{code:title=OpenEjbTransactionCallerBean .java|borderStyle=solid}
@Stateless
@Transactional(Transactional.TxType.REQUIRES_NEW)
public class OpenEjbTransactionCallerBean implements OpenEjbTransactionCaller {
@Inject
@Named(EntityManagerProducer.oracleEntityManagerName)
private EntityManager oracleEntityManager;
@Inject
@Named(EntityManagerProducer.navisionEntityManagerName)
private EntityManager navisionEntityManager;
@Inject
private RequestLogger requestLogger;
@Resource
private SessionContext sessionContext;
private DoBefore[] doBefores;
@Override
public void setDoBefores (DoBefore[] doBefores) {
this.doBefores = doBefores;
}
@Override
public <V> V call (MyCallable<V> callable) throws Exception {
Assert.assertNotNull(oracleEntityManager);
Assert.assertNotNull(navisionEntityManager);
Assert.assertNotNull(requestLogger);
Assert.assertNotNull(sessionContext);
oracleEntityManager.clear();
navisionEntityManager.clear();
if (doBefores != null) {
for (DoBefore doBefore: doBefores) {
doBefore.doBefore(oracleEntityManager, navisionEntityManager,
requestLogger);
}
}
try {
return callable.call(oracleEntityManager, navisionEntityManager,
requestLogger);
} finally {
sessionContext.setRollbackOnly(); // NIEMALS auskommentieren!
könnte die gesamte Testdatenbank zerlegen...
}
}
}
{code}
{code:title=MyCallable.java|borderStyle=solid}
public interfaceMyCallable<V> {
public V call(EntityManager oracleEntityManager, EntityManager
navisionEntityManager, RequestLogger requestLogger)
throws Exception;
}
{code}
{code:title=DoBefore .java|borderStyle=solid}
public interface DoBefore {
public void doBefore(EntityManager oracleEntityManager, EntityManager
navisionEntityManager,
RequestLogger requestLogger) throws
FiverxLinkSecurityException;
}
{code}
{code:title=Bar.java|borderStyle=solid}
@LocalClient
public class MyTestClass extends OpenEjbTest {
@EJB
private MyTestRessource myTestRessource;
@Test
public void testEjb() {
super.transactionCaller.call(new FiverxCallable<Object>() {
@Override
public Object call (EntityManager oracleEntityManager,
EntityManager navisionEntityManager,
RequestLogger requestLogger)
throws Exception {
myTestRessource.simpleTestMethod();
}
});
}
}
{code}
> New Transaction gets rolled back
> --------------------------------
>
> Key: OPENEJB-2122
> URL: https://issues.apache.org/jira/browse/OPENEJB-2122
> Project: OpenEJB
> Issue Type: Bug
> Environment: Java 8 update 51 64bit
> Windows 7
> Reporter: Pascal Knüppel
> Priority: Critical
>
> I am currently on a project where I need to rollback only part of my
> transaction. I tested my code on wildfly and it works perfectly. With openejb
> though all my transactions are rolled back and I am not able to find a
> workaround.
> I have a really simple stateless bean which calls 2 methods. One method has
> attribute transaction required and the second has transaction requires new.
> {code:title=MyTestRessource.java|borderStyle=solid}
> @Stateless
> @Path("test")
> public class MyTestRessource {
> @Inject
> private MyTestBean myTestBean;
> @GET
> @Path("testMethod")
> @Transactional(Transactional.TxType.NOT_SUPPORTED)
> public String simpleTestMethod() {
> myTestBean.persistAnEntity();
> myTestBean.doOnFail();
> return "execution finished";
> }
> }
> {code}
> {code:title=MyTestBean.java|borderStyle=solid}
> @Stateless
> @Path("test")
> @RequestScoped
> public class MyTestBean {
> @Inject
> @Named(EntityManagerProducer.oracleEntityManagerName)
> private EntityManager oracleEntityManager;
> @Resource
> private SessionContext sessionContext;
> @Transactional(Transactional.TxType.REQUIRED)
> public void persistAnEntity() {
> FRX_SECURITYVERSION frx_securityversion = new FRX_SECURITYVERSION(
> "SV0111", new Date()
> );
> oracleEntityManager.persist(frx_securityversion);
> sessionContext.setRollbackOnly();
> }
> @Transactional(Transactional.TxType.REQUIRES_NEW)
> public void doOnFail() {
> FRX_SECURITYVERSION frx_securityversion = new FRX_SECURITYVERSION(
> "SV0100", new Date(System.currentTimeMillis() + 1000L * 60 *
> 60 * 24 * 365 * 999)
> );
> oracleEntityManager.persist(frx_securityversion);
> }
> }
> {code}
> If I execute this code in wildfly I get no problems and the entry from the
> second method is persisted while the first is rolled back. With openejb both
> entries are rolled back. Is there anything I am missing?
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)