But I want to use JTA, that's why I include the Narayana and JTA-and-Hiberante.
On 08 Mar 2014, at 08:58, Thomas Hug <[email protected]> wrote: > Hi Ove, > > By default, the DS JPA module comes with a RESOURCE_LOCAL transaction > strategy (which the Data module is reusing). Your persistence.xml states a > JTA transaction type though, so you have to change the transaction strategy > according to [1]. > > Hope that helps, > Thomas > > [1] http://deltaspike.apache.org/jpa.html#jta-support > > > On Fri, Mar 7, 2014 at 11:39 PM, Ove Ranheim <[email protected]> wrote: > >> Hi Gerhard, >> >> Ivan Vasyliev already made a great example that demonstrate this issue >> (btw: https://issues.apache.org/jira/browse/DELTASPIKE-473). >> >> Please have a look at: >> https://github.com/vasilievip/cdi-jpa-jta-generic-dao >> >> To properly demonstrate DS behaviour, you must disable the Spring stuff, >> hence you need to: >> >> pom.xml (comment out) >> >> <!-- >> <dependency> >> <groupId>org.springframework.data</groupId> >> <artifactId>spring-data-jpa</artifactId> >> <version>${spring-data-jpa.version}</version> >> </dependency> >> --> >> >> SprintDataProductDAO.java (comment out): >> >> public interface SpringDataProductDAO >> /* extends JpaRepository<Product, Long> */ >> { >> >> } >> >> ProductService.java (comment out) >> >> // @Inject >> // SpringDataProductDAO springProductDAO; >> >> // @Transactional >> // public List<Product> findAll() { >> // assert springProductDAO != null; >> // List<Product> products = new ArrayList<Product>(); >> // Iterator<Product> productIterator = >> springProductDAO.findAll().iterator(); >> // while (productIterator.hasNext()) { >> // products.add(productIterator.next()); >> // } >> // return products; >> // } >> // >> // @Transactional >> // public Long save(Product product) { >> // assert springProductDAO != null; >> // springProductDAO.save(product); >> // return product.getId(); >> // } >> >> Exception stracktrace: >> >> Tests run: 2, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 3.841 sec >> <<< FAILURE! - in com.javafiction.common.persistence.test.ProductServiceTest >> testFindAll(com.javafiction.common.persistence.test.ProductServiceTest) >> Time elapsed: 1.808 sec <<< ERROR! >> org.apache.deltaspike.data.api.QueryInvocationException: Failed calling >> Repository: >> [Repository=com.acme.persistence.DeltaspikeProductDAO,entity=com.acme.model.Product,method=save,exception=class >> java.lang.IllegalStateException,message=A JTA EntityManager cannot use >> getTransaction() >> at >> org.hibernate.jpa.spi.AbstractEntityManagerImpl.getTransaction(AbstractEntityManagerImpl.java:1368) >> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >> at >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) >> at >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >> at java.lang.reflect.Method.invoke(Method.java:606) >> at >> com.javafiction.common.persistence.resources.JtaEntityManagerProxy.invoke(JtaEntityManagerProxy.java:45) >> at com.sun.proxy.$Proxy63.getTransaction(Unknown Source) >> at >> org.apache.deltaspike.jpa.impl.transaction.ResourceLocalTransactionStrategy.getTransaction(ResourceLocalTransactionStrategy.java:308) >> at >> org.apache.deltaspike.jpa.impl.transaction.ResourceLocalTransactionStrategy.rollbackAllTransactions(ResourceLocalTransactionStrategy.java:274) >> at >> org.apache.deltaspike.jpa.impl.transaction.ResourceLocalTransactionStrategy.execute(ResourceLocalTransactionStrategy.java:153) >> at >> org.apache.deltaspike.data.impl.tx.TransactionalQueryRunner.executeTransactional(TransactionalQueryRunner.java:72) >> at >> org.apache.deltaspike.data.impl.tx.TransactionalQueryRunner.executeQuery(TransactionalQueryRunner.java:54) >> at >> org.apache.deltaspike.data.impl.handler.QueryHandler.invoke(QueryHandler.java:80) >> at com.sun.proxy.$Proxy61.save(Unknown Source) >> at com.acme.services.ProductService.save2(ProductService.java:72) >> // <= this is the real issue >> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >> at >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) >> at >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >> at java.lang.reflect.Method.invoke(Method.java:606) >> at >> org.apache.webbeans.intercept.AbstractInvocationContext.proceed(AbstractInvocationContext.java:110) >> at >> org.apache.webbeans.intercept.InterceptorInvocationContext.realProceed(InterceptorInvocationContext.java:72) >> at >> org.apache.webbeans.intercept.InterceptorInvocationContext.proceed(InterceptorInvocationContext.java:66) >> at >> com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:89) >> at >> com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorRequired.intercept(TransactionalInterceptorRequired.java:52) >> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >> at >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) >> at >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >> at java.lang.reflect.Method.invoke(Method.java:606) >> at >> org.apache.webbeans.component.InterceptorBean.intercept(InterceptorBean.java:151) >> at >> org.apache.webbeans.intercept.InterceptorInvocationContext.proceed(InterceptorInvocationContext.java:62) >> at >> org.apache.webbeans.intercept.DefaultInterceptorHandler.invoke(DefaultInterceptorHandler.java:138) >> at >> com.acme.services.ProductService$$OwbInterceptProxy0.save2(com/acme/services/ProductService.java) >> at >> com.javafiction.common.persistence.test.ProductServiceTest.testFindAll(ProductServiceTest.java:56) >> >> >> Thanks to Ivan for making this demo! >> >> I'm after exact equivalent of this test case. The test case fails on: >> deltaspikeProductDAO.save(product); >> >> The demo demonstrates that it works with Spring Data, but breaks with >> DeltaSpike Data. >> >> Cheers, >> Ove >> >> On 07 Mar 2014, at 21:46, Gerhard Petracek <[email protected]> >> wrote: >> >>> hi ove, >>> >>> please provide a link to a demo-app which illustrates the issue. >>> >>> regards, >>> gerhard >>> >>> http://www.irian.at >>> >>> Your JSF/JavaEE powerhouse - >>> JavaEE Consulting, Development and >>> Courses in English and German >>> >>> Professional Support for Apache MyFaces >>> >>> >>> >>> 2014-03-07 21:27 GMT+01:00 Ove Ranheim <[email protected]>: >>> >>>> public class TestBean { >>>> >>>> @Inject >>>> @PartsRepository >>>> private EntityManager em; >>>> >>>> @Transactional >>>> public void transaction(TestEntity entity) { >>>> em.persist(entity); >>>> } >>>> } >>>> >>>> and in test-case: >>>> >>>> @Inject >>>> private TestBean testBean; >>>> >>>> @Test >>>> public void testMe() throws Exception { >>>> testBean.transaction(m); // <== exception message below >>>> } >>>> >>>> stacktrace: >>>> >>>> java.lang.NullPointerException: null >>>> at >>>> >> org.jboss.weld.injection.AbstractResourceInjection.getResourceReference(AbstractResourceInjection.java:44) >>>> at >>>> >> org.jboss.weld.injection.AbstractResourceInjection.injectResourceReference(AbstractResourceInjection.java:53) >>>> at org.jboss.weld.util.Beans.injectEEFields(Beans.java:331) >>>> at >>>> >> org.jboss.weld.injection.producer.ResourceInjector.inject(ResourceInjector.java:59) >>>> at >>>> >> org.jboss.weld.injection.producer.DefaultInjector$1.proceed(DefaultInjector.java:66) >>>> at >>>> >> org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48) >>>> at >>>> >> org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:64) >>>> at >>>> >> org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:90) >>>> at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:150) >>>> at >>>> >> org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:69) >>>> at >>>> >> org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:733) >>>> at >>>> >> org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:789) >>>> at >>>> >> org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:92) >>>> at org.jboss.weld.util.Beans.injectBoundFields(Beans.java:358) >>>> at >>>> org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:369) >>>> at >>>> >> org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:72) >>>> at >>>> >> org.jboss.weld.injection.producer.ResourceInjector.inject(ResourceInjector.java:60) >>>> at >>>> >> org.jboss.weld.injection.producer.DefaultInjector$1.proceed(DefaultInjector.java:66) >>>> at >>>> >> org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48) >>>> at >>>> >> org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:64) >>>> at >>>> >> org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:90) >>>> at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:150) >>>> at >>>> >> org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:69) >>>> at >>>> >> org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:733) >>>> at >>>> >> org.jboss.weld.bean.interceptor.CdiInterceptorFactory.create(CdiInterceptorFactory.java:45) >>>> at >>>> >> org.jboss.weld.interceptor.proxy.InterceptionContext.initInterceptorInstanceMap(InterceptionContext.java:93) >>>> at >>>> >> org.jboss.weld.interceptor.proxy.InterceptionContext.of(InterceptionContext.java:68) >>>> at >>>> >> org.jboss.weld.interceptor.proxy.InterceptionContext.forNonConstructorInterception(InterceptionContext.java:63) >>>> at >>>> >> org.jboss.weld.injection.producer.InterceptorApplyingInstantiator.newInstance(InterceptorApplyingInstantiator.java:53) >>>> at >>>> >> org.jboss.weld.injection.producer.BasicInjectionTarget.produce(BasicInjectionTarget.java:85) >>>> at >>>> >> org.jboss.weld.injection.producer.BeanInjectionTarget.produce(BeanInjectionTarget.java:183) >>>> at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:149) >>>> at >>>> org.jboss.weld.context.AbstractContext.get(AbstractContext.java:96) >>>> at >>>> >> org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:98) >>>> at >>>> >> org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:78) >>>> at >>>> >> com.parts.persistence.test.repository.TestBean$Proxy$_$$_WeldClientProxy.transaction(Unknown >>>> Source) >>>> at >>>> >> com.parts.persistence.test.repository.PartsRepositoryTest.testMe(PartsRepositoryTest.java:141) >>>> >>>> >>>> This stacktrace doesn't provide me much lead to what's wrong. Is there a >>>> way to unwrap what's going on behind the scene: >>>> >>>> at >>>> >> com.parts.persistence.test.repository.TestBean$Proxy$_$$_WeldClientProxy.transaction(Unknown >>>> Source) >>>> at >>>> >> com.parts.persistence.test.repository.PartsRepositoryTest.testMe(PartsRepositoryTest.java:141) >>>> >>>> >>>> Cheers, >>>> Ove >>>> >>>> On 07 Mar 2014, at 20:11, Gerhard Petracek <[email protected]> >>>> wrote: >>>> >>>>> you can use a separated class and annotate it (or its methods) with >>>>> @Transactional -> inject it in your test and delegate to it. >>>>> >>>>> regards, >>>>> gerhard >>>>> >>>>> http://www.irian.at >>>>> >>>>> Your JSF/JavaEE powerhouse - >>>>> JavaEE Consulting, Development and >>>>> Courses in English and German >>>>> >>>>> Professional Support for Apache MyFaces >>>>> >>>>> >>>>> >>>>> 2014-03-07 19:56 GMT+01:00 Ove Ranheim <[email protected]>: >>>>> >>>>>> Hi Gerhard, >>>>>> >>>>>> Thanks for your prompt response. >>>>>> >>>>>> I use shrinkwrap desc: >>>>>> >>>>>> >>>> >> .getOrCreateInterceptors().clazz(TransactionalInterceptor.class.getName()) >>>>>> >>>>>> >>>> >> .clazz(com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorMandatory.class.getName()) >>>>>> >>>>>> >>>> >> .clazz(com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorNever.class.getName()) >>>>>> >>>>>> >>>> >> .clazz(com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorNotSupported.class.getName()) >>>>>> >>>>>> >>>> >> .clazz(com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorRequired.class.getName()) >>>>>> >>>>>> >>>> >> .clazz(com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorRequiresNew.class.getName()) >>>>>> >>>>>> >>>> >> .clazz(com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorSupports.class.getName()).up() >>>>>> >>>>>> >>>> >> .getOrCreateAlternatives().clazz(BeanManagedUserTransactionStrategy.class.getName()).up() >>>>>> >>>>>> According to #2: anything missing? >>>>>> >>>>>> Roger #1. If I use RequestScoped instead, I get this error: >>>>>> >>>>>> testMe(com.parts.persistence.test.repository.PartsRepositoryTest) >> Time >>>>>> elapsed: 0.071 sec <<< ERROR! >>>>>> java.lang.NullPointerException: null >>>>>> at >>>>>> >>>> >> org.jboss.weld.injection.AbstractResourceInjection.getResourceReference(AbstractResourceInjection.java:44) >>>>>> at >>>>>> >>>> >> org.jboss.weld.injection.AbstractResourceInjection.injectResourceReference(AbstractResourceInjection.java:53) >>>>>> at org.jboss.weld.util.Beans.injectEEFields(Beans.java:331) >>>>>> at >>>>>> >>>> >> org.jboss.weld.injection.producer.ResourceInjector.inject(ResourceInjector.java:59) >>>>>> at >>>>>> >>>> >> org.jboss.weld.injection.producer.DefaultInjector$1.proceed(DefaultInjector.java:66) >>>>>> at >>>>>> >>>> >> org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48) >>>>>> at >>>>>> >>>> >> org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:64) >>>>>> at >>>>>> >>>> >> org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:90) >>>>>> at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:150) >>>>>> at >>>>>> org.jboss.weld.context.AbstractContext.get(AbstractContext.java:96) >>>>>> at >>>>>> >>>> >> org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:733) >>>>>> at >>>>>> >>>> >> org.jboss.weld.injection.producer.AbstractMemberProducer.getReceiver(AbstractMemberProducer.java:128) >>>>>> at >>>>>> >>>> >> org.jboss.weld.injection.producer.AbstractMemberProducer.produce(AbstractMemberProducer.java:148) >>>>>> at >>>>>> >>>> >> org.jboss.weld.bean.AbstractProducerBean.create(AbstractProducerBean.java:183) >>>>>> at >>>>>> org.jboss.weld.context.AbstractContext.get(AbstractContext.java:96) >>>>>> at >>>>>> >>>> >> org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:98) >>>>>> 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:137) >>>>>> >>>>>> Appreciate you help! >>>>>> >>>>>> Cheers, >>>>>> ove >>>>>> >>>>>> On 07 Mar 2014, at 19:47, Gerhard Petracek < >> [email protected]> >>>>>> wrote: >>>>>> >>>>>>> hi ove, >>>>>>> >>>>>>> #1 currently only std. scopes are supported by ContextControl. >>>>>>> #2 it will work once TransactionalInterceptor gets called >>>>>>> >>>>>>> regards, >>>>>>> gerhard >>>>>>> >>>>>>> http://www.irian.at >>>>>>> >>>>>>> Your JSF/JavaEE powerhouse - >>>>>>> JavaEE Consulting, Development and >>>>>>> Courses in English and German >>>>>>> >>>>>>> Professional Support for Apache MyFaces >>>>>>> >>>>>>> >>>>>>> >>>>>>> 2014-03-07 19:12 GMT+01:00 Ove Ranheim <[email protected]>: >>>>>>> >>>>>>>> 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 >>>>>>>> >>>>>>>> >>>>>>>> >>>>>> >>>>>> >>>> >>>> >> >>
