Является ли метод конфигурации 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 (); :(
Венката Раджу

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

ОБНОВИТЬ:

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

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

6
org.hibernate.service.ServiceRegistryBuilder также не рекомендуется!
Accollativo

11
Да, кажется, что ServiceRegistryBuilder сам по себе устарел, просматривая документацию, они предлагают вместо этого использовать StandardServiceRegistryBuilder. Поэтому я думаю, что вызов теперь должен быть новым StandardRegistryBuilder (). ApplySettings (configuration.getProperties ()). Build ();
Саймон Б.

Я не могу найти StandardRegistryBuilder в hibernate 4.3, может быть, он там был изменен?
Дежелл

7
Вместо build () нужен buildServiceRegistry (), верно? Я не могу найти ServiceRegistry.build ().
Герберт

43
Похоже, что миссия команды hibernate осуждает все, что они создают.
3-го

16

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

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

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

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


так как мы делаем сессии сейчас? какой объект назначен интерфейсу serviceRegistry ??
Исмаил Мармуш

@IsmailMarmoush - я не слишком много играл с этим, но добавил несколько дополнительных ссылок.
ziesemer

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

    }
}

Некоторые устаревшие методы используются в этом коде.
Кевин Бауэрсокс

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

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

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

получение ошибки: метод buildSessionFactory () в конфигурации типа не применим для аргументов (StandardServiceRegistry)
Anju

4

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

Как правило, если Javadoc говорит одно, а некоторая документация, не относящаяся к 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 начальная загрузка

Вы также можете загрузить Hibernate, используя JPA:

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. Тем не менее, он также SessionFactoryрасширяет EntityManagerFactory, so the actual object that's built is aSessionFactoryImpl`.

Вывод

Эти два метода начальной загрузки влияют на поведение Hibernate. При использовании встроенного загрузчика Hibernate ведет себя в устаревшем режиме, предшествующем JPA.

При начальной загрузке с использованием JPA Hibernate будет вести себя в соответствии со спецификацией JPA.

Есть несколько различий между этими двумя режимами:

Для более подробной информации об этих различиях, проверьте 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

@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 выше, чтобы он принимал объект конфигурации в качестве параметра:

    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

здесь много API-интерфейсов, которые устарели в структуре ядра Hibernate.

мы создали фабрику сессий, как показано ниже:

SessionFactory sessionFactory = новая конфигурация (). Configure (). BuildSessionFactory ();

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

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

  2. StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder (). ApplySettings (configuration.getProperties ());

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

Класс ServiceRegistryBuilder заменен StandardServiceRegistryBuilder с 4.3.0. Похоже, в версии 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();

вместо ниже в спящем 4.3

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.