4 Replies Latest reply on Jan 22, 2010 9:54 PM by navansys

    HibernatePersistenceProvider does not support feature Feature.WILDCARD_AS_COUNT_QUERY_SUBJECT

    navansys
      I am getting a MySQL error in sql generated by the EntityQuery class for tables with compound pk. EntityQuery is generating code like: "select count(a,b) from table" for tables with compound pks (such as TEE table in the Seam in Action Open18 app). MySQL does not support multiple values for the count(x) function so it throws an error. EntityQuery when  generating this code first checks:

      persistenceProvider.supportsFeature(Feature.WILDCARD_AS_COUNT_QUERY_SUBJECT).

      If true then it generates select count(*). When false select count(a,b).

      The implementation for HibernatePersistenceProvider has a @postcreate method called init() which sets this feature. It looks like this @postcreate method does not get executed.


      This integration test fails:

      `
      package org.hack.util.test;

      import org.jboss.seam.Component;
      import org.jboss.seam.mock.SeamTest;
      import org.jboss.seam.persistence.HibernatePersistenceProvider;
      import org.jboss.seam.persistence.PersistenceProvider;
      import org.jboss.seam.persistence.PersistenceProvider.Feature;
      import org.testng.annotations.Test;

      public class PersistenceProviderTest extends SeamTest {

          @Test
          public void verifyPersistenceProvider() throws Exception {
              // setupClass();
              new FacesRequest() {
                  @Override
                  protected void invokeApplication() {
                      PersistenceProvider pp =
                          (PersistenceProvider) Component.getInstance(
                                  "org.jboss.seam.persistence.persistenceProvider");
                      System.out.println("PersistenceProvider=" + pp.getClass());
                      assert (pp.getClass().equals(HibernatePersistenceProvider.class)) :
                          "Expected HibernatePersistenceProvider, found" + pp.getClass();
                      assert (pp.supportsFeature(Feature.WILDCARD_AS_COUNT_QUERY_SUBJECT)) :
                          "Hibernate PersistenceProvider does not support wildcard count";
                  }

              }.run();
          }
      }`


        • 1. Re: HibernatePersistenceProvider does not support feature Feature.WILDCARD_AS_COUNT_QUERY_SUBJECT
          navansys
          I'll make my question a little bit more focused in the hopes of receiving a reply.

          PersistenceProvider has an init function marked as @PostConstruct:

          `   @PostConstruct
             // @Create method not called on stateless components
             public void init()
             {
             }`

          org.jboss.seam.persistence.HibernatePersistenceProvider overrides init as so:

             @Override
             public void init()
             {
                super.init();
                featureSet.add(Feature.WILDCARD_AS_COUNT_QUERY_SUBJECT);
             }
            
          Why then does my integration test fail? Specifically this line:

          ` assert (pp.supportsFeature(Feature.WILDCARD_AS_COUNT_QUERY_SUBJECT)) :
                     "Hibernate PersistenceProvider does not support wildcard count";
          `

          BTW:
          Seam 2.2.0 GA
          jdk 1.6.0_16
          jboss 5.1.0.GA
          • 2. Re: HibernatePersistenceProvider does not support feature Feature.WILDCARD_AS_COUNT_QUERY_SUBJECT
            garcimouche

            Same problem here, I'm using Hibernate as the PeristenceProvider however the Feature.WILDCARDASCOUNTQUERYSUBJECT is not set....

            • 3. Re: HibernatePersistenceProvider does not support feature Feature.WILDCARD_AS_COUNT_QUERY_SUBJECT
              navansys

              Frank,


              This is a known bug: JBSEAM-4454. Doesn't seem to be much discussion about fixing it, so you're best off overriding HibernatePersistenceProvider, replacing component org.jboss.seam.persistence.persistenceProvider. Your class will be at a higher precedence than HibernatePersistenceProvider and will be used instead.


              This worked for me:



              package org.open18.persistence;
              
              import javax.annotation.PostConstruct;
              
              import org.jboss.seam.ScopeType;
              import org.jboss.seam.annotations.Install;
              import org.jboss.seam.annotations.Name;
              import org.jboss.seam.annotations.Scope;
              import org.jboss.seam.annotations.intercept.BypassInterceptors;
              import org.jboss.seam.log.Log;
              import org.jboss.seam.log.Logging;
              import org.jboss.seam.persistence.HibernatePersistenceProvider;
              
              /**
               * Addresses problem with HibernatePersistenceProvider by explicitly
               * calling HibernatePersistenceProvider.init() from
               * a PostConstruct method that actually gets called on postconstruct.
               * 
               */
              @Name("org.jboss.seam.persistence.persistenceProvider")
              @Scope(ScopeType.STATELESS)
              @BypassInterceptors
              @Install(classDependencies={"org.hibernate.Session", "javax.persistence.EntityManager"})
              public class MoBetterHibernatePersistenceProvider extends HibernatePersistenceProvider {
              
                  private static Log log = Logging.getLog(MoBetterHibernatePersistenceProvider.class);
              
                  @PostConstruct
                  public void init()
                  {
                     log.debug("MoBetterPersistenceProvider init");
                     super.init();
                  }
              
              }




              • 4. Re: HibernatePersistenceProvider does not support feature Feature.WILDCARD_AS_COUNT_QUERY_SUBJECT
                navansys

                More info on this bug here: PersistenceProviderPostConstructBug.