web-dev-qa-db-ja.com

メソッドorg.hibernate.cfg.Configuration.getClassMapping(className)の4.3.xから5.xへのHibernate移行

Hibernate 4.3.xには、クラス_org.hibernate.cfg.Configuration_のメソッドgetClassMapping(className)があります。しかし、Hibernate 5.xでは、このgetClassMapping(className)メソッドはConfigurationクラスから削除されています。

Hibernate-5のコード置換とは何ですか?

この移行の問題について助けてください。

22
Nirav Patel

I 投稿 Broadleaf CommerceにもPersistentClassが必要なため:

私はHibernate 5を使用してツールを作成しており、これらの変更のいくつかを...メタデータを取得するには、Serviceloaderを使用します。

package org.broadleafcommerce.openadmin.server.dao;

import org.hibernate.boot.SessionFactoryBuilder;
import org.hibernate.boot.spi.MetadataImplementor;
import org.hibernate.boot.spi.SessionFactoryBuilderFactory;
import org.hibernate.boot.spi.SessionFactoryBuilderImplementor;

public class EntityMetaData implements SessionFactoryBuilderFactory {

    private static final ThreadLocal<MetadataImplementor> meta = new ThreadLocal<>();

    @Override
    public SessionFactoryBuilder getSessionFactoryBuilder(MetadataImplementor metadata, SessionFactoryBuilderImplementor defaultBuilder) {
        meta.set(metadata);
        return defaultBuilder;
    }

    public static MetadataImplementor getMeta() {
        return meta.get();
    }
}

次のファイルが必要になります。

/resources/META-INF/services/org.hibernate.boot.spi.SessionFactoryBuilderFactory

完全修飾クラス名を使用します。私の例では次のとおりです。

org.broadleafcommerce.openadmin.server.dao.EntityMetaData
5
John

PersisterCreationContextのオブジェクトを取得し、これを試してください:-

PersistentClass persistentClass = 
persisterCreationContext.getMetadata().getEntityBinding(className);

Plsはこれをチェックします link例3.8。ネイティブブートストラップ-すべてをまとめる)は、StandardRegistry、メタデータ、およびHibernate 5.xのsessionFactory

これで、persisterCreationContextからメタデータを取得していたので、すでにメタデータを取得しているため、エンティティの必要なPersistentClassオブジェクトをすぐに取得できます。

SessionFactory sessionFactory = metadata.getSessionFactoryBuilder().build();
PersistentClass persistentClass = metadata.getEntityBinding(className);
2
Avis

Hibernate 3および4では、次のようにします

URL configFileURL = getResource(); //some method to get hold of the location of your hibernate.cfg.xml
Configuration configuration = (new Configuration()).configure(configFileURL);
Iterator classMappings = configuration.getClassMappings();
  while (classMappings.hasNext()) {
    PersistentClass persistentClass = (PersistentClass) classMappings.next();
    //do somthing 
    }

Hibernate 5では、このようにメタデータを初期化します

URL configFileURL = getResource(); //some method to get hold of the location of your hibernate.cfg.xml
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder().configure(configFileURL).build();
Metadata metaData = new MetadataSources(standardRegistry).getMetadataBuilder().build();

メタデータでgetEntityBindings()を使用します

Collection<PersistentClass> entityBindings = metadata.getEntityBindings();
Iterator<PersistentClass> iterator = entityBindings.iterator();
  while (iterator.hasNext()) {
    PersistentClass persistentClass = iterator.next();    
    //do somthing
  }
1
Vering

これは Hibernate 5.0移行ガイド および Hibernateユーザーガイドのブートストラップの章 で説明されています(特に "レガシーブートストラップ" 付録を参照してください) )。

簡単に言うと、Configurationは引き続きストレートブートストラップでサポートされていますが、bootstrapプロセスに「フック」するには、新しいbootstrap AP​​Iを使用する必要があります。

0
Steve Ebersole