tomee-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Matthew Broadhead <matthew.broadh...@nbmlaw.co.uk>
Subject Re: JtaEntityManager GC
Date Thu, 15 Feb 2018 16:18:11 GMT
i was told to inject the entitymanager like this
@ApplicationScoped
public class EntityManagerProducer {
     @PersistenceUnit(unitName = "myDb")
     private EntityManagerFactory entityManagerFactory;

     @Produces
     @Default
     @RequestScoped
     public EntityManager create() {
         return this.entityManagerFactory.createEntityManager();
     }

     public void dispose(@Disposes @Default EntityManager entityManager) {
         if (entityManager.isOpen()) {
             entityManager.close();
         }
     }
}
injecting into your example like:
@ApplicationScoped
public class MyRepo1{
     @Inject
     private EntityManager em;

     public List<Something> loadSomeStuff(){  //Non transactional
         em.createQuery(....).getResultList();
     }
}
also with JSF i alway found @PostConstruct a bit dodgy.  way better to add
<f:metadata>
      <f:viewAction action="#{myViewBean.onload}" />
</f:metadata>
then in your bean you have an onload function (no annotation necessary)
public String onload() {
     someVar1= myRepo1.loadSomeStuff();
     someVar2 = myRepo2.loadSomeStuff();
     return null;  //you can call action here if necessary
}

On 13/02/2018 09:42, cocorossello wrote:
> Hi,
>
> Calling entityManager.clear() seems the best approach since most of the
> queries are not executed inside a transaction. But I have no idea on where I
> should use it or what would be a good implementation pattern.
>
> I mean, let's say I have a @ViewScoped with a couple of injected
> @ApplicationScoped.
>
> @ViewScoped
> public class MyViewBean{
>
> @Inject
> private MyRepo1 myRepo1;
>
> @Inject
> private MyRepo2 myRepo2;
>
> @PostConstruct
> void init(){
>     someVar1= myRepo1.loadSomeStuff();
>     someVar2 = myRepo2.loadSomeStuff();
> }
> ..
> }
>
> @ApplicationScoped
> public class MyRepo1{
>      @PersistenceContext(unitName = "myUnit")
>      private EntityManager entityManager;
>
>      public List<Something> loadSomeStuff(){  //Non transactional
>          entityManager.createQuery(....).getResultList();
>      }
> }
>
> }
>
> So, should I call entityManager.clear() after all non transactional queries
> (or at least some of them)? Can I do it in some web filter?
>
> This seems pretty basic stuff but I can't get it right...
>
>
>
> --
> Sent from: http://tomee-openejb.979440.n4.nabble.com/TomEE-Users-f979441.html


Mime
View raw message