Thanks Christian now it's clear the problem and why we cannot use the EMF solution.... So let me come back on your second solution. I have some doubt about the EntityManager creation. Your code posted is only a part of solution. Can you complete it adding the initialValue of ThreadLocal implementation?
Regards Giuseppe 2014-11-06 13:39 GMT+01:00 Christian Schneider <ch...@die-schneider.net>: > Of course using the EntityManagerFactory is a possible and working way. > The problem is that it creates a lot of boilerplate code. > > // This is how persist looks in JEE container managed persistence > public void updateTask(Task task) { > em.persist(task); > } > > // This is halfway correct handling of transactions and em lifecycle > for plain java > public void updateTaskEmf(Task task) { > userTransaction.begin(); > EntityManager em = emf.createEntityManager(); > try { > em.persist(task); > userTransaction.commit(); > } catch (RuntimeException e) { > userTransaction.rollback(); > throw e; > } finally { > em.close(); > } > } > > As you see you need a lot of code around your business functionality to > handle EntityManager lifecycle and transactions. It becomes even more > complex if you > assume cascaded transactions where you have one transacted method that > calls other transacted methods. There you also want the EntityManager to > life throughout the cascaded transaction so you can do different changes to > persistent entities in the same em session before you finally commit. > > So this is the reason why JEE does container managed persistence and also > the reason why we wrap the EntityManager in aries. > > I proposed ThreadLocal to make it more obvious that EntityManager is not > thread safe and each thread will use its own instance. We do a similar > thing inside the wrapped EntityManager that jpa-container-context creates > but I think it is not good to hide that fact too much. > > This is how we currently wrap the EntityManager: > https://github.com/apache/aries/blob/trunk/jpa/jpa- > container-context/src/main/java/org/apache/aries/jpa/ > container/context/transaction/impl/JTAEntityManagerHandler.java > As you see there is a lot of special processing for the different calls to > EntityManager. Some calls we even swallow. My hope is that with a plain > EntityManager inside a ThreadLocal most of that complexity can be removed. > After all it is pretty difficult to prove that our current wrapping > solution works correctly in all imaginable cases. > > The wrapping is also especially difficult as we handle JPA 2.0 and 2.1 at > the same time as we have to wrap two different versions of the > EnitityManager interface. > > Christian > > On 06.11.2014 12:36, Giuseppe Gerla wrote: > >> Hi Christian >> I am not an expert on JTA, so for me it is not fully clear the problem >> you're facing. >> From my experience I can say, however, that the use of ThreadLocal is not >> recommended. >> From my point of view, it would be better to use something like this: >> >> >> @Singleton >> @Transactional >> public class TaskServiceImpl implements TaskService { >> EntityManagerFactory emf; >> >> public void updateTask(Task task) { >> emf.createEntityManager().persist(task); >> } >> } >> >> >> Regards >> Giuseppe >> >> >> > -- > Christian Schneider > http://www.liquid-reality.de > > Open Source Architect > http://www.talend.com > >