Чи застарілий спосіб конфігурації buildSessionFactory () в режимі глибокого сну


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 .
в.ladynev

Відповіді:


374

Так, це застаріло. Замініть свій SessionFactory таким:

У сплячому режимі 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 також знищений!
Accollativo

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

Я не можу знайти StandardRegistryBuilder в сплячому режимі 4.3, може бути, що він там був змінений?
Dejell

7
Замість build () потрібно buildServiceRegistry (), правда? Я не можу знайти ServiceRegistry.build ().
Герберт

43
Здається, місією сплячої команди є знецінення всього, що вони створюють.
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

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

Так. Є кращі способи завантаження режиму сплячки, як наступні.

Сонник-рідний завантажувач

Спадковий Configurationоб’єкт є менш потужним, ніж використання BootstrapServiceRegistryBuilder, введений після сплячки 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:

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 поводиться у старім режимі, який передує 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

Досить дивно, як у Зимовому режимі все сприймається та знижується. Раніше це було в один момент. 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

У сплячому режимі 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, які застаріли в основній системі сплячого режиму.

ми створили фабрику сесій, як показано нижче:

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

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

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

  2. StandardServiceRegistryBuilder builder = новий 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.