Является ли buildSessionFactory () устаревшим в hibernate 4? - PullRequest
211 голосов
/ 24 декабря 2011

Когда я обновил версию Hibernate с 3.6.8.final до 4.0.0.final, я получил предупреждение об устаревшем методе buildSessionFactory() в этой строке:

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

javadoc рекомендует использовать другойметод

buildSessionFactory(ServiceRegistry serviceRegistry)

но в документации я нашел устаревший вариант: (

Можете ли вы помочь мне с этим небольшим недоразумением?

Ответы [ 16 ]

372 голосов
/ 12 января 2012

Да, это устарело.Замените свой 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;
}

ОБНОВЛЕНИЕ:

В Hibernate 4.3 ServiceRegistryBuilder устарел .Вместо этого используйте следующее.

serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
            configuration.getProperties()).build();
15 голосов
/ 24 декабря 2011

Да, это устарело.http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/cfg/Configuration.html#buildSessionFactory() специально говорит вам использовать другой метод, который вы нашли вместо (buildSessionFactory(ServiceRegistry serviceRegistry)) - так что используйте его.

Документация копируется от выпуска к выпуску, и, вероятно, просто не былаеще не обновлено (они не переписывают руководство с каждым выпуском) - так что доверяйте Javadocs.

Подробности этого изменения можно посмотреть на:

Некоторые дополнительные ссылки:

6 голосов
/ 29 марта 2013

или

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

    }
}
5 голосов
/ 01 февраля 2014

Код проверен для работы в 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 голосов
/ 26 декабря 2011

Нередко встречаются расхождения между разными версиями документации.Большинство разработчиков рассматривают документацию как рутинную работу, и они, как правило, откладывают ее.

Как правило, если javadoc говорит что-то одно, а некоторая документация, не относящаяся к javadoc, противоречит этому, есть вероятность, что javadocболее точным.Программисты, скорее всего, будут поддерживать Javadoc в актуальном состоянии, внося изменения в код ... потому что "источник" для Javadoc находится в том же файле, что и код.

В случае тегов @deprecatedЭто виртуальная уверенность, что Javadoc является более точным.Разработчики осуждают вещи после тщательного рассмотрения ... и (вообще говоря) они не обесценивают их.

4 голосов
/ 24 декабря 2011

Это так просто: документы JBoss не на 100% в хорошем состоянии. Идти с , что говорит JavaDoc : buildSessionFactory(ServiceRegistry serviceRegistry).

3 голосов
/ 25 апреля 2017

Если вы используете 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 голосов
/ 15 мая 2015

Лучший способ создания SessionFactory объекта в последнем выпуске hibernate 4.3.0 и далее заключается в следующем:

Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().
applySettings(configuration.getProperties());
SessionFactory factory = configuration.buildSessionFactory(builder.build());
1 голос
/ 15 апреля 2014
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();
 }
0 голосов
/ 26 июня 2018

В hibernate 5.3.1, вы можете попробовать это:

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

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

SessionFactory sf = sources.buildSessionFactory();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...