Hi Christian
I checked code about exception raised during integration test in Karaf and
I found an issue on transaction type retrieving method. Using magaed
exception, eclipselink (but I think also hibernate) set transaction manager
in rollback only state and this do fail the test.
To avoid this behaviour I put the transaction type in the properties map of
EntitiManagerFactory and then, when it is needed, I get it from the map.

I also change integration tests to manage the same service and same
functionality with several implementation (eclipselink and hibernate). Now
we have an example of my use case.

Before I open a pull request, I'd like to know wdyt.



2015-04-15 14:43 GMT+02:00 Giuseppe Gerla <giuseppe.ge...@gmail.com>:

> From my point of view, because we are working on a beta version of new
> Aries JPA, the best way to proceed is to prepare a set of annotation
> similar to JTA 1.2 and use it.
> In this way we can complete our beta, test it and we are ready to delivery
> the new Aries JPA when Karaf will be compliant with JTA 1.2.
> If I can do something let me know.
>
> About your suggestion to use <tx:transaction method="*" value="Required"
> /> in the bean definition, I try it but it didn't work. It seems that I
> have to manually (by code) begin and commit the transaction.
> Car test with eclipselink gives
> javax.transaction.RollbackException: Transaction is marked for rollback
>         at
> org.apache.geronimo.transaction.manager.TransactionImpl.registerSynchronization(TransactionImpl.java:147)
>         at
> org.eclipse.persistence.transaction.JTATransactionController.registerSynchronization_impl(JTATransactionController.java:92)
>         at
> org.eclipse.persistence.transaction.AbstractTransactionController.bindToCurrentTransaction(AbstractTransactionController.java:134)
>         at
> org.eclipse.persistence.transaction.AbstractTransactionController.registerSynchronizationListener(AbstractTransactionController.java:431)
>         at
> org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerWithTransactionIfRequired(UnitOfWorkImpl.java:4431)
>         at
> org.eclipse.persistence.internal.jpa.transaction.JTATransactionWrapper.registerIfRequired(JTATransactionWrapper.java:110)
>         at
> org.eclipse.persistence.internal.jpa.EntityManagerImpl.getActivePersistenceContext(EntityManagerImpl.java:1957)
>         at
> org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:863)
>         at
> org.eclipse.persistence.internal.jpa.QueryImpl.performPreQueryFlush(QueryImpl.java:963)
>         at
> org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:207)
>         at
> org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:469)
>         at
> net.lr.jpa.itest.service.impl.CarServiceWithSupplierImpl.getCars(CarServiceWithSupplierImpl.java:34)
> Task test with hibernate gives
> java.lang.NullPointerException
>         at
> net.lr.txmanager.blueprint.JpaInterceptor.postCallWithException(JpaInterceptor.java:53)
>         at
> org.apache.aries.blueprint.proxy.Collaborator.postInvokeExceptionalReturn(Collaborator.java:136)
>         at
> org.apache.aries.blueprint.proxy.Collaborator.preInvoke(Collaborator.java:78)
>         at Proxya4faffee_6ed9_4df4_990d_596565ea8a97.addTask(Unknown
> Source)
>
>
> this evening I try to debug the application. Have you any suggestion?
>
>
>
> 2015-04-15 14:20 GMT+02:00 Christian Schneider <ch...@die-schneider.net>:
>
>> In the newest code I removed support for transactions and currently rely
>> on aries transaction for that.
>> If you use <tx:transaction method="*" value="Required" /> in your bean
>> then it should work.
>> The annotation based transactions that aries transaction also provide do
>> not work for me. Unfortunately defined by aries transaction blueprint is
>> also not very usable
>> as you can not set it per class but only per method.
>>
>> I originally planned to work on aries transaction to better support
>> annotation based transactions. Unfortuantely the code is quite tailored for
>> xml described transactions. As the annotations are also not great I gave up
>> on this for now.
>>
>> So I propose to write a new module that only covers annotation based
>> transactions and also uses different annotations. Now the question is if we
>> should define another set of annotations or just use the jta 1.2
>> annotations. These are nice but currently do not work in karaf. Upgrading
>> to these is quite a lot of work. So I tend to wait with this part until
>> karaf supports the jta 1.2 annotations.
>>
>> Another possibility would be to define our own set of annotations that
>> are similar to jhe jta 1.2 ones and make sure the new transaction module is
>> working with these but then wait for a release until jta 1.2 works in karaf
>> and switch before the release. This way we would avoid another set of
>> custom annotations and can still already test.
>>
>> WDYT?
>>
>> Christian
>>
>>
>> On 15.04.2015 12:21, Giuseppe Gerla wrote:
>>
>>> Hi Christian
>>> I'd like to know if you make some progress about jpa-experiments and
>>> transaction.
>>>
>>> On my fork I create 2 bundles to make integration test and give you some
>>> example of my use cases.
>>> 1. jpa-container-testbundle is equivalent of yours jpa-blueprint-example,
>>> but I add some code for caching.
>>> 2. jpa-container-itest start karaf 2.4.1 environment and launch following
>>> tests:
>>>        - TaskServiceImplTest.testPersistence is the same of yours but
>>> without transaction management by code. This test fail because there is
>>> no
>>> transaction manager active
>>>        - CarServiceImplTest.testCache check that the service is able to
>>> create a cache. This test pass. If you see the code the getColours method
>>> use init method in "lazy fetch" mode. If you try to use init method by
>>> blueprint file to initialize the bean you have an exception because the
>>> EmSupplier is not ready.
>>>        - CarServiceImplTest.testDatabaseInitializationQuery check that
>>> properties are passed to EMF correctly. This test pass.
>>>        - CarServiceImplTest.testAddQuery check that is possible to
>>> insert
>>> into db. This test fail because there is no transaction manager active
>>>
>>>
>>> regards
>>> Giuseppe
>>>
>>>
>>>
>>>
>>> 2015-04-10 18:09 GMT+02:00 Giuseppe Gerla <giuseppe.ge...@gmail.com>:
>>>
>>>  Hi Christian
>>>> I pushed on my fork 2 bundles to test jpa-experiments in an integrated
>>>> environment.
>>>> I create to test classes.
>>>> The first class is for non JTA (LOCL_RESOURCE) transaction that works
>>>> using .begin(), .commit() by code.
>>>> The second one is thinked to test JTA transaction. This test doesn't
>>>> work
>>>> because it is based on @Transaction annotation, but there is no
>>>> transaction
>>>> active.
>>>>
>>>> I have a question for you. Using Pax-exam and Junit to do the test, how
>>>> can I enable the transaction support? I have no xml file...
>>>>
>>>>
>>>> regards
>>>> Giuseppe
>>>>
>>>> 2015-04-10 14:49 GMT+02:00 Giuseppe Gerla <giuseppe.ge...@gmail.com>:
>>>>
>>>>  Sorry, for my misunderstanding.
>>>>> Yesterday I saws rows in table but probably they were entered from the
>>>>> first version of software that had transactions triggered by xml.
>>>>> With annotation, it seems that insert work fine but there are no commit
>>>>> on the database. So I have no new rows in table.
>>>>>
>>>>> I'd like to create (and I'm working on this topic) a bundle like
>>>>> jpa-container-itest to do integration test of jpa-experiments.
>>>>> I hope to commit a first draft of this bundle on my fork this evening.
>>>>>
>>>>> Regards
>>>>> Giuseppe
>>>>>
>>>>>
>>>>> 2015-04-10 0:17 GMT+02:00 Christian Schneider <ch...@die-schneider.net
>>>>> >:
>>>>>
>>>>>  Interesting. So you got the annotation based transactions working with
>>>>>> aries transaction blueprint?
>>>>>> Can you post your examples somewhere?
>>>>>>
>>>>>> I would also be interested in the necessary changes in your cache.
>>>>>> Maybe
>>>>>> we can also avoid that this is has to be done.
>>>>>>
>>>>>> Christian
>>>>>>
>>>>>>
>>>>>> Am 09.04.2015 um 19:18 schrieb Giuseppe Gerla:
>>>>>>
>>>>>>  Hi Christian
>>>>>>> good work!
>>>>>>> I make several test today and all works fine also with transaction. I
>>>>>>> use
>>>>>>> your example to inject EmSupplier in my service and use @Transaction
>>>>>>> annotation on methods that need it.
>>>>>>> I find only one restriction. In my previous service implementation I
>>>>>>> create
>>>>>>> an internal cache during the bean instantiation. This is a problem
>>>>>>> because
>>>>>>> the EmSupplier is created after during the configuration phase. So I
>>>>>>> changed my cache in a lazy cache and all works fine.
>>>>>>>
>>>>>>> I hope during next days to go in detail of your  examples.
>>>>>>> If you need more help to develop other feature let me know.
>>>>>>>
>>>>>>>
>>>>>>> N.B. I cannot test closure example because I don't use Java 8
>>>>>>>
>>>>>>> Regards
>>>>>>> Giuseppe
>>>>>>>
>>>>>>>
>>>>>>> 2015-04-09 14:46 GMT+02:00 Christian Schneider <
>>>>>>> ch...@die-schneider.net
>>>>>>>
>>>>>>>> :
>>>>>>>>
>>>>>>>   Sorry it took a little longer. I have now committed my changes.
>>>>>>>
>>>>>>>> In fact I removed the check in the BeanProcessor and do it now
>>>>>>>> inside
>>>>>>>> the
>>>>>>>> interceptor.
>>>>>>>>
>>>>>>>> Apart from that I worked on making the jpa code compatible to aries
>>>>>>>> transaction and making blueprint-jpa independent of jta.
>>>>>>>> The reason for this is that JTA can be used independently from jpa
>>>>>>>> so
>>>>>>>> it
>>>>>>>> makes sense to not mix both. For example we should be able to run
>>>>>>>> JMS
>>>>>>>> and JPA in the same transaction. This would not work if we tie
>>>>>>>> transactions too much to jpa.
>>>>>>>>
>>>>>>>> While trying to integrate with aries transaction blueprint I found
>>>>>>>> some
>>>>>>>> problems:
>>>>>>>> - annotation based transactions are implemented but do not work. I
>>>>>>>> think
>>>>>>>> this is a bug in aries. The beanprocessor does not seem to be
>>>>>>>> active.
>>>>>>>> - The aries @Transaction annotation is defined in a very unfortunate
>>>>>>>> way.
>>>>>>>> It only applies to methods. In many cases you would simply want to
>>>>>>>> annotate
>>>>>>>> a class with it.
>>>>>>>> Unfortunately I defined the copied transactions differently so they
>>>>>>>> also
>>>>>>>> applied to classes. So there was a conflict between the two. I now
>>>>>>>> completely removed the transaction annotation from the
>>>>>>>> jpa-experiments
>>>>>>>> code. If we want to use annotation based transactions we will have
>>>>>>>> to
>>>>>>>> use
>>>>>>>> different annotations anyway. I deferred this part for now.
>>>>>>>>
>>>>>>>> Apart from that the xml declared transactions from aries transaction
>>>>>>>> blueprint now work nicely together with the new blueprint-jpa
>>>>>>>> module.
>>>>>>>> The
>>>>>>>> example is defined this way now.
>>>>>>>>
>>>>>>>> For the closure based example I introduced a new TransactionType
>>>>>>>> enum
>>>>>>>> to
>>>>>>>> avoid using the aries one.
>>>>>>>>
>>>>>>>> So both examples should now work again.
>>>>>>>>
>>>>>>>> I also found that I forgot to implement the @PersistenceUnit
>>>>>>>> support.
>>>>>>>> This
>>>>>>>> is one possible next enhancement.
>>>>>>>> For transaction support I wonder if we can reuse aries transaction
>>>>>>>> blueprint. I am not sure to be honest. It is tailored a lot towards
>>>>>>>> xml
>>>>>>>> based annotations with * based filters and such. I would be in
>>>>>>>> favour
>>>>>>>> of
>>>>>>>> dropping xml support completely for jpa and transactions and only
>>>>>>>> have
>>>>>>>> annotations in the new code. Not sure if the community agrees
>>>>>>>> though.
>>>>>>>>
>>>>>>>> Christian
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On 08.04.2015 22:24, Giuseppe Gerla wrote:
>>>>>>>>
>>>>>>>>   Yes, I verified that the problem is that the TxBeanProcessor
>>>>>>>> check the
>>>>>>>>
>>>>>>>>> transaction type in the following code
>>>>>>>>>
>>>>>>>>> Interceptor interceptor = (getTransactionType(supplierProxy) ==
>>>>>>>>> PersistenceUnitTransactionType.JTA) ?
>>>>>>>>>                        new XaTxInterceptorImpl(tm, supplierProxy)
>>>>>>>>> : new
>>>>>>>>> ResourceLocalTransactionalInterceptor(supplierProxy);
>>>>>>>>> cdr.registerInterceptorWithComponent(beanData, interceptor);
>>>>>>>>>
>>>>>>>>> Did you remove this part?
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>   --
>>>>>>>>>
>>>>>>>> Christian Schneider
>>>>>>>> http://www.liquid-reality.de
>>>>>>>>
>>>>>>>> Open Source Architect
>>>>>>>> http://www.talend.com
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>
>> --
>> Christian Schneider
>> http://www.liquid-reality.de
>>
>> Open Source Architect
>> http://www.talend.com
>>
>>
>

Reply via email to