Является ли buildSessionFactory () устаревшим в hibernate 4?
когда я обновил версию Hibernate от 3.6.8.финал 4.0.0.наконец я получил предупреждение об устаревшем методе buildSessionFactory() в этой строке:
private static final SessionFactory sessionFactory =
new Configuration().configure().buildSessionFactory();
javadoc рекомендует использовать другой метод
buildSessionFactory(ServiceRegistry serviceRegistry)
а в документация Я нашел устаревший вариант :(
вы можете помочь мне с этим маленьким недоразумением ?
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.
особенности этого изменения можно посмотреть в:
- исходный код: https://github.com/hibernate/hibernate-core/commit/0b10334e403cf2b11ee60725cc5619eaafecc00b
- билет:https://hibernate.onjira.com/browse/HHH-5991
дополнительные ссылки:
или
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 и выше, ваш код должен быть:
настройки конфигурация = новая конфигурация ().настроить();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder ().applySettings(конфигурацию.getProperties ());
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();
Comments