Hi,

I'm not able to start the TransactionScoped in due time. I'm doing an 
experiment on using ds-jpa together with JTA-and-Hibernate 
(https://github.com/jbosstm/quickstart/tree/master/jta-and-hibernate). 

The persistence.xml uses JTA and binds to a JdbcDataSource bound to JNDI. If I 
use the TransactionManager directly, it all works. However, when I use the 
BeanManagedUserTransactionStrategy it fails. I'd like to make use of the 
@Transactional and @TransactionScope.

Here are some code snippets.

    public static void bindNamingAndTransactionService() throws Exception {
        if(txInitialized) return;
        // Start JNDI server
        NAMING_BEAN.start();

        // Bind JTA implementation with default names
        JNDIManager.bindJTAImplementation();

        // Bind JTA implementation with JBoss names. Needed for JTA 1.2 
implementation.
        // See https://issues.jboss.org/browse/JBTM-2054
        // resolve naming parse container for comp and bind
        NAMING_BEAN.getNamingInstance().createSubcontext(new 
NamingParser().parse("jboss"));
        
jtaPropertyManager.getJTAEnvironmentBean().setTransactionManagerJNDIContext("java:/jboss/TransactionManager");
        jtaPropertyManager.getJTAEnvironmentBean()
                
.setTransactionSynchronizationRegistryJNDIContext("java:/jboss/TransactionSynchronizationRegistry");
        JNDIManager.bindJTAImplementation();

        JdbcDataSource dataSource = new JdbcDataSource();
        dataSource.setURL("jdbc:h2:~/partsdb;MVCC=TRUE");
        dataSource.setUser("sa");
        dataSource.setPassword("");

        InitialContext context = new InitialContext();
        context.bind("java:/jboss/primaryDS", dataSource);
        txInitialized = true;
    }

EntityManagerProducer:

    @Produces
    @PartsRepository
    @TransactionScoped
    protected EntityManager createEntityManager() {
        return entityManagerFactory.createEntityManager();
    }

    @Produces
    public EntityManagerFactory entityManagerFactory() {
        if (entityManagerFactory == null) {
            try {
                if (!txInitialized) bindNamingAndTransactionService();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            return Persistence.createEntityManagerFactory("primary");
        }
        throw new UnsupportedOperationException();
    };

Arquillian Weld-Embedded-1.1 test:

    @BeforeClass
    public static void beforeClazz() throws Exception {
        
BeanProvider.getContextualReference(ContextControl.class).startContext(TransactionScoped.class);
    }

    @Test
    @Transactional
    public void testMe() throws Exception {
       // do something with TransactionScoped EntityManager
    }

If I move startContext to @Before method, the same error occurs.


Exception:

testMe(com.parts.persistence.test.repository.PartsRepositoryTest)  Time 
elapsed: 0.063 sec  <<< ERROR!
org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active 
contexts for scope type 
org.apache.deltaspike.jpa.api.transaction.TransactionScoped
        at 
org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:680)
        at 
org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:79)
        at 
org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:99)
        at 
org.jboss.weld.proxies.EntityManager$893098196$Proxy$_$$_WeldClientProxy.persist(Unknown
 Source)
        at 
com.parts.persistence.test.repository.PartsRepositoryTest.testMe(PartsRepositoryTest.java:130)

ideas?

Cheers,
Ove


Reply via email to