Details
Description
Consider scenario:
- blueprint service A with JPA
A { C find() { return em.find(); } void delete(C c) { em.remove(c) } }
- blueprint bean B with A injected. B call methods of A within transaction
B { @Transaction B1() { C = A.find(); // Entity returned by find (em.find()) A.delete(C); // Entity is not attached!!!!!! } }
Reason:
Method of bean A are proxied in following way:
emsupplier.precall()
emsupplier.get()
find(); //or delete()
emsupplier.postcall()
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
Attachments
Issue Links
- breaks
-
ARIES-2050 Aries JPA 2.7 shouldn't always reuse EM instance from previous coordinations
- Resolved