web-dev-qa-db-ja.com

buildSessionFactory()はHibernate 4で廃止予定ですか?

Hibernateのバージョンを3.6.8.finalから4.0.0.finalに更新したとき、次の行に廃止予定のメソッドbuildSessionFactory()に関する警告が表示されました。

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

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

buildSessionFactory(ServiceRegistry serviceRegistry)

しかし ドキュメント 私は廃止予定の変種を見つけました:(

この小さな誤解で私を助けてもらえますか?

211
pushistic

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

In 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;
}

更新日

Hibernate 4. ServiceRegistryBuilderは廃止予定です。代わりに以下を使用してください。

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

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

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

この変更の詳細は、次の場所にあります。

その他の参考資料

15
ziesemer

または

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();

    }
}
6
mixturez

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);
5
user2080225

それはこれと同じくらい簡単です:JBossドキュメントは100%完全に手入れされていません。 JavaDocが言っていることbuildSessionFactory(ServiceRegistry serviceRegistry)を続けてください。

4
Matt Ball

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

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

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

4
Stephen C

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);
    }
  }
3
Hasan K

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

Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().
applySettings(configuration.getProperties());
SessionFactory factory = configuration.buildSessionFactory(builder.build());
3
kavi temre
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();
 }
1
Bharathiraja
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
Pratap A.K

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
Quan VO

上記の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
Nadjib Mami

In 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
saneryee

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
Creditto

これは、休止状態のコアフレームワークで推奨されていない多くのAPIです。

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

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

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

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

  2. StandardServiceRegistryBuilderビルダー= new StandardServiceRegistryBuilder()。applySettings(configuration.getProperties());

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

クラスServiceRegistryBuilderは、4.3.0からStandardServiceRegistryBuilderに置き換えられました。 5.0リリースでは多くの変更があるようです。それでも、廃止予定のAPIとそれに適した代替手段についてはそれほど明確ではありません。すべてのインクリメンタルリリースには、廃止予定のAPIが追加されています。これらは、リリース5.0のコアフレームワークを微調整するためのものです。

0
Creditto