[ 
https://issues.apache.org/jira/browse/ARIES-1346?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14615132#comment-14615132
 ] 

Christian Schneider commented on ARIES-1346:
--------------------------------------------

I agree that this is a typical use case and we should support it. I am not sure 
though how to implement it in the best way.
About two weeks ago I discussed with Peter Kriens how to handle the 
EntityManager lifecycle and transactional contexts. He proposed to use the OSGi 
coordination API for this task (See 
https://osgi.org/javadoc/r5/enterprise/org/osgi/service/coordinator/Coordination.html).

I think it could indeed help. The concept would be to start a Coordination 
where the transaction starts and attach the EntityManager to the Coordination 
as a Participant. This would allow to then close the EntityManager when the 
Coordination ends without directly tying it to the Transaction. 
What do you think?




> EntityManager injection issue
> -----------------------------
>
>                 Key: ARIES-1346
>                 URL: https://issues.apache.org/jira/browse/ARIES-1346
>             Project: Aries
>          Issue Type: Improvement
>          Components: JPA
>    Affects Versions: jpa-2.0.0
>         Environment: karaf-4.0.0, java 8
>            Reporter: Michał Woś
>            Priority: Critical
>
> Consider scenario:
> - blueprint service A with JPA 
> {code}
>    A {
>       C find() {
>          return em.find();
>       }
>       void delete(C c) {
>          em.remove(c)
>       }
>   }
> {code}
> - blueprint  bean B with A injected. B call methods of A within transaction
> {code}
> B {
>    @Transaction
>    B1() {
>       C = A.find(); // Entity returned by find (em.find())
>       A.delete(C); // Entity is not attached!!!!!!
>    }
> }
> {code}
> Reason:
> Method of bean A are proxied in following way:
> {code}
> emsupplier.precall()
> emsupplier.get()
> find(); //or delete()
> emsupplier.postcall()
> {code}
> Each method call gets its own EM so find has one EM, delete has another one. 
> Entity C is managed within first EM but not the second.
> EM should be shared in transaction within single Thread, not by single method 
> call.
> Please also note that:
> - transaction could be JTA and use different units in single transaction
> My scenario:
> - bundle A1,A2,A3 with persistence JPA exposing entities through services 
> (domain module), Each bundle (A1, A2, A3) uses different schema in database 
> (different unit name)
> - bundle B1,B2,B3 with rest  services using entity services in a transaction
> (Separation of domain logic from business logic). Each of B1,B2,B3 can use 
> any method of A1,A2,A3



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to