Thanks Mark ! I'll do so then
----- Mail original ----- De : Mark Struberg <[email protected]> À : Adrian Gonzalez <[email protected]>; "[email protected]" <[email protected]> Cc : Envoyé le : Vendredi 24 août 2012 13h49 Objet : Re: RequestScoped entityManager If you are using EJB and EE then you should be fine with just using an Extended EM. LieGrue, strub ----- Original Message ----- > From: Adrian Gonzalez <[email protected]> > To: "[email protected]" > <[email protected]>; Mark Struberg <[email protected]> > Cc: > Sent: Friday, August 24, 2012 12:54 PM > Subject: Re: RequestScoped entityManager > >> If you like to use UserTransactions, then check our JPA module. Guess > Gerhard added a sample for it. > Sorry I've looked but didn't found it ;( > >> On a few servers the EE - injected EMF will only allow you to create > managed EMs. > What I'm missing is what happens when there's no JTA tx started (i.e. on > RENDER_VIEW when one is calling a lazy association, does the em throws an > error > ?) > Note : I'm using transaction-type="JTA" on my persistence.xml. > >> If you like to use UserTransactions, then check our JPA module. Guess > Gerhard added a sample for it. > > In fact, this is my case (I'm using EJBs for 'service' layer). > > If I want a an em with transaction-type="JTA" and requestScoped (i.e. > not having LIE on RENDER_VIEW), I guess I have the following 2 solutions : > > Solution 1 : using application managed em > a. have em produced 'a la' softwaremill > b. create a JSF lifecyclelistener using UserTx, and doing something like : > * INVOKE_APLICATION#before : userTx.begin() > * INVOKE_APLICATION#after : userTx.commit() (and test isRollbackOnly) > * RENDER_VIEW#before : userTx.begin() > * RENDER_VIEW #after : userTx.rollback() > c. and a servlet Filter for handling exceptional cases in jsf listener (in > case > after is not called) : rollback in those cases > That's a bit overkill for a requestScope em, so I must be missing something. > > Solution 2 : use an extendedPersistenceContext with a request scoped > statefull > EJB > In fact, this is so simple, it must be the solution in my case > > @Stateful > @RequestScoped > public class EntityManagerProducer { > > @PersistenceContext(type=PersistenceContextType.EXTENDED private > EntityManager em; > > @Produces @RequestScoped > public EntityManager getEntityManager() { > return em; > } > } > > > Thanks and sorry to deviate from DS stuff - didn't thought so initially ! > > ----- Mail original ----- > De : Mark Struberg <[email protected]> > À : "[email protected]" > <[email protected]> > Cc : > Envoyé le : Vendredi 24 août 2012 11h47 > Objet : Re: RequestScoped entityManager > > Well, we might miss some explanation for this lines > > >> @PersistenceContext(unitName="default") >> private EntityManager entityManager; > This only works in SE. In an EE container you will get a Container Managed > EM, > which is not manageable by the user, but strictly bound to EJBs. > > Even the sample of softwaremill will not work on every EE container > >> @PersistenceUnit(name="pu") >> private EntityManagerFactory emf; > > On a few servers the EE - injected EMF will only allow you to create managed > EMs. > > The best approach is to either create an additional > EntityManagerFactoryProducer > where you can even stuff in JPA properties in a central place, and inject it > via > CDI: > >> @Inject >> private EntityManagerFactory emf; > Or you can simply do: > >> @ApplicationScoped // important! >> public class EntityManagerProducer { >> private EntityManagerFactory emf = > Persistence.createEntityManagerFactory(); >> >> @Produces @RequestScoped >> public EntityManager getEntityManager() { >> return > new EntityManagerTxEnlistDecorator (emf.createEntityManager()); >> } >> >> public void close(@Disposes EntityManager em) { >> em.close(); >> } >> } >> > > Please note that this is the classic way to get a non-JTA EM! If you like to > use > UserTransactions, then check our JPA module. Guess Gerhard added a sample for > it. > > LieGrue, > strub > > > > > ----- Original Message ----- >> From: Adrian Gonzalez <[email protected]> >> To: "[email protected]" > <[email protected]> >> Cc: >> Sent: Friday, August 24, 2012 11:38 AM >> Subject: RequestScoped entityManager >> >> Hello, >> >> Does DS provides a requestScopes em ? >> >> I tried to to something > like https://cwiki.apache.org/EXTCDI/jpa-usage.html, but >> I had an error (don't remember which one, I think it was because em >> wasn't associated with current tx) >> >> For the moment, I'm using softwaremill EntityManagerTxEnlistDecorator >> > (https://github.com/softwaremill/softwaremill-common/tree/master/softwaremill-cdi/src/main/java/pl/softwaremill/common/cdi/persistence >> and doing something like (I'm doing it from memory so, there can be > some >> errors) : >> >> public class EntityManagerProducer { >> @PersistenceUnit(name="pu") >> private EntityManagerFactory emf; >> >> @Produces @RequestScoped >> public EntityManager getEntityManager() { >> return > new EntityManagerTxEnlistDecorator (emf.createEntityManager()); >> } >> >> public void close(@Disposes EntityManager em) { >> em.close(); >> } >> } >> >> Not sure if it deserves a special classe in DS (perhaps at least >> softwaremill EntityManagerTxEnlistDecorator ?) >> >> Thanks >> >
