deltaspike-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Adrian Gonzalez <adr_gonza...@yahoo.fr>
Subject Re: RequestScoped entityManager
Date Fri, 24 Aug 2012 10:54:46 GMT
> 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 <struberg@yahoo.de>
À : "deltaspike-dev@incubator.apache.org" <deltaspike-dev@incubator.apache.org>
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 <adr_gonzalez@yahoo.fr>
> To: "deltaspike-dev@incubator.apache.org" <deltaspike-dev@incubator.apache.org>
> 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
>


Mime
View raw message