Является ли buildSessionFactory() устаревшим в спящем режиме 4?

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

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

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

buildSessionFactory(ServiceRegistry serviceRegistry)

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

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

Ответ 1

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

UPDATE:

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

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

Ответ 2

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

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

Специфика этого изменения можно просмотреть по адресу:

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

Ответ 3

или

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

    }
}

Ответ 4

Это так просто: документы JBoss не на 100% отлично поддерживаются. Пойдите с что говорит JavaDoc: buildSessionFactory(ServiceRegistry serviceRegistry).

Ответ 5

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

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

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

Ответ 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);

Ответ 7

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

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

Ответ 8

Если вы используете 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);
    }
  }

Ответ 9

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

Ответ 10

public void sampleConnection() throws Exception {

     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.");
}

Ответ 11

Я редактировал метод, созданный 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);

Ответ 12

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

    }
}

Ответ 13

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

    }

}

Ответ 14

здесь много API, устаревших в структуре ядра hibernate.

мы создали сеанс factory, как показано ниже:

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

Метод buildSessionFactory устарел из версии hibernate 4 и заменен новым API. Если вы используете спящий режим 4.3.0 и выше, ваш код должен быть:

  • Конфигурация конфигурации = новая Конфигурация(). configure();

  • StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(). applySettings (configuration.getProperties());

  • SessionFactory factory= configuration.buildSessionFactory(builder.build());

Класс ServiceRegistryBuilder заменяется стандартнымServiceRegistryBuilder из 4.3.0. Похоже, в версии 5.0 будет много изменений. Тем не менее, нет ясности в отношении устаревших API и подходящих альтернатив для использования. Каждый инкрементный выпуск содержит более устаревший API, они в состоянии тонкой настройки базовой структуры для выпуска 5.0.

Ответ 15

Просто импортируйте следующий пакет,

import org.hibernate.cfg.Configuration;