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
>> 
>

Reply via email to