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



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



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


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



buildSessionFactory(ServiceRegistry serviceRegistry)



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



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

795   16  

16 ответов:

Да, он устарел. Замените конфигурации следующим образом:

на 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 is устаревший. Вместо этого используйте следующее.

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

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

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

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

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

или

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

    }
}

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

код проверен для работы в спящем режиме 4.3.0. Обратите внимание, что вы можете удалить параметр XML filename или указать свой собственный путь. Это похоже на (но исправленные опечатки) другие сообщения здесь, но это правильно.

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

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

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

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

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

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

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

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

я редактировал методом Батбаатар выше поэтому он принимает объект конфигурации в качестве параметра:

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

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

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

    }

}

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

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

SessionFactory sessionFactory = новая конфигурация ().формировать.)(buildSessionFactory();

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

  1. настройки конфигурация = новая конфигурация ().настроить();

  2. StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder ().applySettings(конфигурацию.getProperties ());

  3. SessionFactory factory = конфигурация.buildSessionFactory(построитель.build ());

класс ServiceRegistryBuilder заменен на StandardServiceRegistryBuilder из 4.3.0. Похоже, что в 5.0 будет много изменений освобождать. По-прежнему нет большой ясности в отношении устаревших API и подходящих альтернатив для использования. Каждый инкрементный релиз имеет более устаревший API, они находятся в пути тонкой настройки основной платформы для выпуска 5.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();

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

import org.hibernate.cfg.Configuration;

Comments

    Ничего не найдено.