2016-10-18 3 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; 
    } 

ので、どのように私はSessionFactory#getAllClassMetadataドキュメントによるとEntityManagerFactory.getMetamodel()

+0

これをチェックすることができます:: http://stackoverflow.com/questions/43604928/hibernate-upgrade-to-5-2-session-factory-creation-and-replacing-persistentclas/437186​​26 –

答えて

0

getAllClassMetadata()を交換するとしています:

廃止予定。 EntityManagerFactory.getMetamodel()代わり

それは廃止されていない EntityManagerFactory#getMetamodelを使用することを提案することを

ノートから記述子を使用してください。あなたはウェブ上でそれを使用する方法を説明する多くの例を見つけることができますし、正確に何を達成したいのかについて特定の質問をすることができます。

+0

私はgetAllClassMetadata()、getAllClassMetadata()の代わりにEntityManagerFactory.getMetamodel()を使用すると、文字列のキーを持つマップを返しますが、getMetamodel()はエンティティのセットを返します。どのように一致させる必要がありますか? – 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

関連する問題