2016-10-18 87 views
1

我想從hibernate 3遷移到5.2.3,並且有很多老代碼調用org.hibernate.SessionFactory.getAllClassMetadata,這個方法在hibernate 5中已經被棄用,它建議使用SessoinFactory.getMetaModel(),但是當我試圖調用這個方法時,它似乎也被廢棄了,我繼續研究,找不到任何其他建議使用的方法,任何人都可以提供幫助?如果你能給一個細節用法會非常感激,謝謝。Hibernate 5.2.3 SessionFactory.getAllClassMetadata不再被支持

這裏是getAllClassMetadata的用法:

@Override 
    public Collection<ModelSpecificationSummary> findAllModelSpecificationSummaries() throws RepositoryException { 
     List<ModelSpecificationSummary> summaries = new ArrayList<ModelSpecificationSummary>(); 
     try { 
      Query query = session.createQuery(
          "selecc.name, spec.class from " + Specification.class.getSimpleName() + " spec"); 
      List<Object[]> list = query.list(); 

      SingleTableEntityPersister metadata = (SingleTableEntityPersister) session.getSessionFactory() 
          .getAllClassMetadata() 
          .get(Specification.class.getName()); 
      for (Object[] o : list) { 
       Long id = (Long) o[0]; 
       String name = (String) o[1]; 
       String discriminator = (String) o[2]; 

       Class<? extends ModelSpecification> specificationClass = lookupSpecificationSubclass(metadata, discriminator); 

       ModelSpecificationSummary summary = new ModelSpecificationSummary(id, name, specificationClass); 
       summaries.add(summary); 
      } 

      return summaries; 
     } 
     catch (HibernateException he) { 
      throw new RepositoryException(he); 
     } 
    } 

和lookupSpecificationSubclass類:

private Class<? extends ModelSpecification> lookupSpecificationSubclass(SingleTableEntityPersister metadata, 
                      String discriminator) 
        throws RepositoryException { 
     Class<? extends ModelSpecification> specificationClass = null; 

     String subclass = metadata.getSubclassForDiscriminatorValue(discriminator); 
     if (subclass != null) { 
      try { 
       specificationClass = (Class<? extends ModelSpecification>) Class.forName(subclass); 
      } 
      catch (ClassNotFoundException e) { 
       throw new RepositoryException("Invalid class found for specification " + discriminator, e); 
      } 
     } 
     else { 
      throw new RepositoryException("No class found for specification " + discriminator); 
     } 
     return specificationClass; 
    } 

所以我怎麼想與EntityManagerFactory.getMetamodel()

+0

您可以檢查此:: http://stackoverflow.com/questions/43604928/hibernate-upgrade-to-5-2-session-factory-creation-and-replacing-persistentclas/437186​​26 –

回答

0

根據SessionFactory#getAllClassMetadata文件替換getAllClassMetadata()

已棄用。從EntityManagerFactory.getMetamodel()代替

注意,它建議使用EntityManagerFactory#getMetamodel它不會被棄用使用描述符。你可以在網上找到許多解釋如何使用它的例子,或者你可以問一個具體的問題,你想要達到什麼目的。

+0

我試圖使用EntityManagerFactory.getMetamodel()來替換getAllClassMetadata(),getAllClassMetadata()返回一個帶有字符串鍵的映射,但getMetamodel()返回一組實體,我應該如何匹配它們,thx – user2995031

+0

有沒有辦法完全匹配由'SessionFactory#getAllClassMetadata'返回的結果與'EntityManagerFactory#getMetamodel'返回的結果一樣,你必須分析每種情況下你需要什麼,以及如何使用你的新方法來完成。我想你可能會發現有用的下面的例子http://stackoverflow.com/a/37695543/5078385。其他示例:http://www.programcreek.com/java-api-examples/index.php?class=javax.persistence.EntityManagerFactory&method=getMetamodel。 – acm

+0

我剛剛編輯了添加使用代碼的問題 – user2995031