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