1 Reply Latest reply on Dec 30, 2005 7:59 PM by epbernard

    Problems using Hibernate Filter annotation with JBoss

    rafael.gumz

      I need to use the Hibernate´s FilterDef and Filter annotations on my EntityBean. I configured the annotations but I couldn´t figure out the right moment to enable it because the EntityManager´s HibernateSession is always a different instance. I´m using a Stateless Session Bean.
      For example, when I get the EntityManager in the first time, I get its HibernateSession and enable the filter, and this filter doesn´t exists in the next time I get the same EntityManager in the same SessionBean.
      I mean, the HibernateSession that had the filter was lost and I have to enable it again if I want the filter to work in the same EntityManager instance.

      The EntityBean and its annotations:

      @Entity(access = AccessType.FIELD)
      @Table(name = "SOME_OTHER_TABLE")
      @FilterDef(name="FilterDomain", parameters={@ParamDef(name="param1" type="string")})
      @Filters({
       @Filter(name="FilterDomain", condition="RV_MEANING is not null and RV_LOW_VALUE <> :param1")
       })
      public class Dominio {
      ...
      }
      


      The SessionBean and the accessor method to get the EntityManager:
      @Stateless
      public abstract class AbstractController {
       @PersistenceContext(unitName="MyContext", type=PersistenceContextType.TRANSACTION)
       private EntityManager em;
      
       public EntityManager getEM() {
       //code to enable the EntityBean´s filters
       EMUtil.enableFilters(this.em);
       return this.em;
       }
      }
      


      The Utility class to enable the filters:
      public class EMUtil {
       public static void enableFilters(EntityManager em) {
       Session session = ((HibernateSession)em).getHibernateSession();
       Filter filter = session.getEnabledFilter("FilterDomain");
       if (filter == null) {
       //always get into the if, the filter must be enabled every time.
       filter = session.enableFilter("FilterDomain");
       filter.setParameter("param1", "A");
       }
       }
      }
      


      I tried to use the javax.ejb.PostConstruct annotation and enabled the filter there, but I get a javax.persistence.TransactionRequiredException that tells me the EntityManager must be access within a transaction. And considering my problem, I believe it would happen the same with the HibernateSession.

      Does anyone have an idea or example where I can use the Hibernate´s Filter annotation without enabling it in the HibernateSession every time I need to use the EntityManager?

        • 1. Re: Problems using Hibernate Filter annotation with JBoss
          epbernard

          you have to enable it each time, cause that's really 2 different session, so

          public EntityManager getEM() {
           //code to enable the EntityBean´s filters
           EMUtil.enableFilters(this.em);
           return this.em;
           }
          and explicit use of getEM() is mandatory

          If you want to use the same EM across different EJB session calls for a given user, use a SFSB and @PersistenceContext(EXTENDED)