2016-10-18 85 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