buildSessionFactory()構成メソッドはHibernateで非推奨になりましたか


215

Hibernateバージョンを3.6.8から4.0.0に更新するとbuildSessionFactory()、次の行で非推奨のメソッドに関する警告が表示されました。

private static final SessionFactory sessionFactory =
         new Configuration().configure().buildSessionFactory();

Javadocは別の方法の使用を推奨しています

buildSessionFactory(ServiceRegistry serviceRegistry)

しかし、ドキュメントでは非推奨のバリアントを見つけました:(

この小さな誤解を手伝ってくれませんか?


4.3.8クイックスタートガイドでも、この例を使用しています:new Configuration().configure()。buildSessionFactory(); :(
Venkata Raju

@VenkataRaju Hibernate 5ではすべてが元に戻り、この例が正しいため、それは悪くないかもしれませんが、(!)ここでのすべての構成例はHibernate 5では有効ではありません
v.ladynev

回答:


374

はい、非推奨です。SessionFactoryを次のものに置き換えます。

ではHibernateは4.0、4.1、4.2

private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;

public static SessionFactory createSessionFactory() {
    Configuration configuration = new Configuration();
    configuration.configure();
    ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(
            configuration.getProperties()). buildServiceRegistry();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    return sessionFactory;
}

更新:

休止状態4.3 ServiceRegistryBuilderがされ、非推奨します。代わりに以下を使用してください。

serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
            configuration.getProperties()).build();

6
org.hibernate.service.ServiceRegistryBuilderも廃止されました!
Accollat​​ivo 2014年

11
はい、ServiceRegistryBuilder自体は非推奨であるようです。ドキュメントを見ると、代わりにStandardServiceRegistryBuilderを使用することをお勧めします。したがって、呼び出しは新しいStandardRegistryBuilder()。applySettings(configuration.getProperties())。build();になるはずです。
Simon B

hibernate 4.3でStandardRegistryBuilderが見つかりません。そこで変更された可能性がありますか?
Dejell 2014

7
build()の代わりにbuildServiceRegistry()が必要ですよね?ServiceRegistry.build()が見つかりません。
ハーバート

43
作成したすべてのものを非推奨にすることは、休止状態のチームの使命のようです。
3urdoch 2014

16

はい、非推奨です。 http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory()は、見つけた他のメソッドを代わりに使用するように具体的に指示します(buildSessionFactory(ServiceRegistry serviceRegistry))-使用してください。

ドキュメントはリリースごとにコピーされ、おそらくまだ更新されていない可能性があります(リリースごとにマニュアルを書き換えることはありません)。Javadocを信頼してください。

この変更の詳細は、次の場所で確認できます。

その他の参考資料:


では、どうやってセッションを作るのですか?serviceRegistryインターフェースに割り当てられているオブジェクトは何ですか?
Ismail Marmoush 2011

@IsmailMarmoush-私はこれをあまりいじっていませんが、いくつかの参照を追加しました。
ジーゼマー

7

または

public class Hbutil {

    private static SessionFactory sessionFactory;
    private static ServiceRegistry serviceRegistry;

    private static SessionFactory configureSessionFactory() throws HibernateException {
        Configuration configuration = new Configuration();
        configuration.configure();
        serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();        
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        return sessionFactory;
    }

    public static SessionFactory getSessionFactory() {
        return configureSessionFactory();

    }
}

このコードでは、いくつかの非推奨メソッドが使用されています。
Kevin Bowersox 2014年

6

Hibernate 4.3.0で動作することが確認されたコード。XMLファイル名パラメータを削除するか、そこに独自のパスを指定できることに注意してください。これは、他の投稿と似ていますが、タイプミスは修正されていますが、これは正しいです。

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;    


Configuration configuration = new Configuration();
configuration.configure("/com/rtw/test/hiber/hibernate.cfg.xml");
ServiceRegistry  serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();        
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);

4

これはとても簡単です。JBossのドキュメントは100%完全に適切に管理されているわけではありません。一緒に行くのJavaDocは言いますbuildSessionFactory(ServiceRegistry serviceRegistry)


4

最新のhibernateリリース4.3.0以降でSessionFactoryオブジェクトを作成するより良い方法は次のとおりです。

Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().
applySettings(configuration.getProperties());
SessionFactory factory = configuration.buildSessionFactory(builder.build());

エラーの取得:タイプConfigurationのメソッドbuildSessionFactory()は引数(StandardServiceRegistry)に適用できません
Anju

4

ドキュメントの異なるバージョン間の不一致を見つけることは珍しいことではありません。ほとんどの開発者はドキュメントを雑用と見なしており、彼らはそれを先延ばしにする傾向があります。

経験則として、javadocが1つのことを言っていて、javadoc以外のドキュメントがそれと矛盾する場合、javadocの方が正確である可能性があります。プログラマは、Javadocの「ソース」がコードと同じファイルにあるため、コードの変更によりjavadocを最新に保つ可能性が高くなります。

@deprecatedタグの場合、javadocがより正確であることはほぼ確実です。開発者は慎重に検討した上で物事を非推奨にします...そして(一般的に言えば)彼らはそれらを非推奨にしません。


1
...そして彼らはそれらを非難しません。... System.getenv(String) bugs.sun.com/bugdatabase/view_bug.do?bug_id=4199068
bestsss

1
怠惰な開発者がドキュメントをコードに合わせて維持することに煩わされず、ユーザーを夢中にさせる一方で、これらがそれ自体をくまなく探して流血のゴミがどのように機能するかを理解しようとするがらくたプロジェクトを見つけることは珍しいことではありません/ ** TODO:comment-me * /:-\
zakmck

@bestsss ...またはそれはConfiguration.buildSessionFactory();)と呼ばれます
v.ladynev

3

あなたが使用している場合にHibernate 5.2以上とし、その後、あなたはこれを使用することができます:

  private static StandardServiceRegistry registry;
  private static SessionFactory sessionFactory;

  public static SessionFactory getSessionFactory() {
    if (sessionFactory == null) {
      try {
        // Creating a registry
        registry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();

        // Create the MetadataSources
        MetadataSources sources = new MetadataSources(registry);

        // Create the Metadata
        Metadata metadata = sources.getMetadataBuilder().build();

        // Create SessionFactory
        sessionFactory = metadata.getSessionFactoryBuilder().build();

      } catch (Exception e) {
        e.printStackTrace();
        if (registry != null) {
          StandardServiceRegistryBuilder.destroy(registry);
        }
      }
    }
    return sessionFactory;
  }

  //To shut down
 public static void shutdown() {
    if (registry != null) {
      StandardServiceRegistryBuilder.destroy(registry);
    }
  }

2

TL; DR

はい、そうです。次のように、Hibernateをブートストラップするより良い方法があります。

Hibernateネイティブのブートストラップ

レガシーConfigurationオブジェクトはBootstrapServiceRegistryBuilder、Hibernate 4以降に導入されたを使用するよりも強力ではありません。

final BootstrapServiceRegistryBuilder bsrb = new BootstrapServiceRegistryBuilder()
    .enableAutoClose();

Integrator integrator = integrator();
if (integrator != null) {
    bsrb.applyIntegrator( integrator );
}

final BootstrapServiceRegistry bsr = bsrb.build();

final StandardServiceRegistry serviceRegistry = 
    new StandardServiceRegistryBuilder(bsr)
        .applySettings(properties())
        .build();

final MetadataSources metadataSources = new MetadataSources(serviceRegistry);

for (Class annotatedClass : entities()) {
    metadataSources.addAnnotatedClass(annotatedClass);
}

String[] packages = packages();
if (packages != null) {
    for (String annotatedPackage : packages) {
        metadataSources.addPackage(annotatedPackage);
    }
}

String[] resources = resources();
if (resources != null) {
    for (String resource : resources) {
        metadataSources.addResource(resource);
    }
}

final MetadataBuilder metadataBuilder = metadataSources.getMetadataBuilder()
    .enableNewIdentifierGeneratorSupport(true)
    .applyImplicitNamingStrategy(ImplicitNamingStrategyLegacyJpaImpl.INSTANCE);

final List<Type> additionalTypes = additionalTypes();
if (additionalTypes != null) {
    additionalTypes.stream().forEach(type -> {
        metadataBuilder.applyTypes((typeContributions, sr) -> {
            if(type instanceof BasicType) {
                typeContributions.contributeType((BasicType) type);
            } else if (type instanceof UserType ){
                typeContributions.contributeType((UserType) type);
            } else if (type instanceof CompositeUserType) {
                typeContributions.contributeType((CompositeUserType) type);
            }
        });
    });
}

additionalMetadata(metadataBuilder);

MetadataImplementor metadata = (MetadataImplementor) metadataBuilder.build();

final SessionFactoryBuilder sfb = metadata.getSessionFactoryBuilder();
Interceptor interceptor = interceptor();
if(interceptor != null) {
    sfb.applyInterceptor(interceptor);
}

SessionFactory sessionFactory = sfb.build();

JPAブートストラップ

JPAを使用してHibernateをブートストラップすることもできます。

PersistenceUnitInfo persistenceUnitInfo = persistenceUnitInfo(getClass().getSimpleName());
Map configuration = properties();

Interceptor interceptor = interceptor();
if (interceptor != null) {
    configuration.put(AvailableSettings.INTERCEPTOR, interceptor);
}

Integrator integrator = integrator();
if (integrator != null) {
    configuration.put(
        "hibernate.integrator_provider", 
        (IntegratorProvider) () -> Collections.singletonList(integrator));
}

EntityManagerFactoryBuilderImpl entityManagerFactoryBuilder = 
    new EntityManagerFactoryBuilderImpl(
        new PersistenceUnitInfoDescriptor(persistenceUnitInfo), 
        configuration
);
EntityManagerFactory entityManagerFactory = entityManagerFactoryBuilder.build();

このようにして、のEntityManagerFactory代わりにを構築しますSessionFactory。ただし、はSessionFactoryImpl`もSessionFactory拡張しEntityManagerFactory, so the actual object that's built is aます。

結論

これら2つのブートストラップメソッドは、Hibernateの動作に影響を与えます。ネイティブブートストラップを使用する場合、HibernateはJPAよりも古いレガシーモードで動作します。

JPAを使用してブートストラップする場合、HibernateはJPA仕様に従って動作します。

これら2つのモードにはいくつかの違いがあります。

  • ネイティブSQLクエリに関するAUTOフラッシュモードの動作
  • エンティティプロキシの構築方法。従来、Hibernateはプロキシの構築時にDBにヒットしませんでしたが、JPAはをスローする必要があるEntityNotFoundExceptionため、DBチェックを要求します。
  • 管理されていないエンティティを削除できるかどうか

これらの違いの詳細については、JpaComplianceクラスをご覧ください。


1
public class HibernateSessionFactory {

private static final SessionFactory sessionFactory = buildSessionFactory1();

private static SessionFactory buildSessionFactory1() {
Configuration configuration = new Configuration().configure(); // configuration
                                                                // settings
                                                                // from
                                                                // hibernate.cfg.xml

StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder();


serviceRegistryBuilder.applySettings(configuration.getProperties());

ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();

return configuration.buildSessionFactory(serviceRegistry);
}

public static SessionFactory getSessionFactory() {
return sessionFactory;
 }

public static void shutdown() {
// Close caches and connection pools
getSessionFactory().close();
 }

「StandardServiceRegistryBuilder」も非推奨になりました。
NixRam 2014

@NitinRam StandardServiceRegistryBuilderは非推奨ではありません。
JPG

Hibernateで非推奨が有効化および無効化される方法はかなり奇妙です。かつては一点だった。stackoverflow.com/questions/17911308/...
NixRam

0

public void sampleConnection()が例外をスローします{

     Configuration cfg = new Configuration().addResource("hibernate.cfg.xml").configure();
     StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
     SessionFactory sessionFactory = configuration.buildSessionFactory(ssrb.build());
     Session session = sessionFactory.openSession();
     logger.debug(" connection with the database created successfuly.");
}

0

上記のbatbaatarによって作成されたメソッドを編集して、Configurationオブジェクトをパラメーターとして受け入れるようにしました。

    public static SessionFactory createSessionFactory(Configuration configuration) {
        serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
                configuration.getProperties()).build();
        factory = configuration.buildSessionFactory(serviceRegistry);
        return factory;
    }

メインクラスで私はやった:

    private static SessionFactory factory;
    private static Configuration configuration 
    ...      
    configuration = new Configuration();
    configuration.configure().addAnnotatedClass(Employee.class);
    // Other configurations, then           
    factory = createSessionFactory(configuration);

0

にHibernate 4.2.2

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class Test {
    public static void main(String[] args) throws Exception
{
    Configuration configuration = new Configuration()
            .configure();

    ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(
            configuration.getProperties()).buildServiceRegistry();

    SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

    Session session = sessionFactory.openSession();

    Transaction transaction = session.beginTransaction();

    Users users = new Users();

    ... ...

    session.save(users);

    transaction.commit();

    session.close();

    sessionFactory.close();

    }
}

0
Tested on 4.2.7 release

package com.national.software.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

import com.national.software.dto.UserDetails;

public class HibernateTest {

    static SessionFactory sessionFactory;

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        UserDetails user = new UserDetails();
        user.setUserId(1);
        user.setUserName("user1");

        Configuration config = new Configuration();
        config.configure();

        ServiceRegistry  serviceRegistry = (ServiceRegistry) new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
        sessionFactory = config.buildSessionFactory(serviceRegistry);

        Session session = sessionFactory.openSession();
        session.beginTransaction();
        session.save(user);
        session.getTransaction().commit();

    }

}

0

hibernateコアフレームワークで廃止された多くのAPIを次に示します。

以下のようにセッションファクトリを作成しました。

SessionFactory sessionFactory = new Configuration()。configure()。buildSessionFactory();

buildSessionFactoryメソッドは、Hibernate 4リリースから非推奨になり、新しいAPIに置き換えられました。hibernate 4.3.0以降を使用している場合、コードは次のようにする必要があります。

  1. 構成configuration = new Configuration()。configure();

  2. StandardServiceRegistryBuilderビルダー=新しいStandardServiceRegistryBuilder()。applySettings(configuration.getProperties());

  3. SessionFactoryファクトリ= configuration.buildSessionFactory(builder.build());

クラスServiceRegistryBuilderは、4.3.0からStandardServiceRegistryBuilderに置き換えられました。5.0リリースでは多くの変更があるようです。それでも、廃止予定のAPIや適切な代替手段についてはあまり明確ではありません。増分リリースごとに廃止予定のAPIが登場し、リリース5.0のコアフレームワークを微調整しています。


0

ではhibernate 5.3.1、これを試すことができます:

ServiceRegistry standardRegistry = 
                new StandardServiceRegistryBuilder().configure().build();

Metadata sources = new MetadataSources(standardRegistry).addAnnotatedClass(MyEntity.class).getMetadataBuilder().build();

SessionFactory sf = sources.buildSessionFactory();

0

5.1にアップデートした後、ここにいる人がいる場合

StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
                MetadataSources sources = new MetadataSources(registry);
                Metadata metadata = sources.getMetadataBuilder().build();
                sessionFactory = metadata.getSessionFactoryBuilder().build();

hibernate 4.3では以下の代わりに

 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(
            configuration.getProperties()). buildServiceRegistry();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.