Создать завод в Hibernate 4
У меня возникли проблемы с созданием фабрики сеансов в Hibernate 4. В Hibernate 3 я просто сделал:
org.hibernate.cfg.Configuration conf= HibernateUtil
.getLimsInitializedConfiguration(systemConfiguration
.getHibernateconfFile());
SessionFactory sf = conf.configure().buildSessionFactory();
теперь мне нужно передать класс ServiceRegistry в buildSessionFactory, но Javadocs чрезвычайно расплывчаты о том, как это сделать. Какие-нибудь советы?
8 ответов:
Да, они устарели предыдущие buildSessionFactory API, и это довольно легко сделать хорошо.. вы можете сделать что-то подобное..
EDIT: ServiceRegistryBuilder является устаревшим. вы должны использовать StandardServiceRegistryBuilder
public void testConnection() throws Exception { logger.info("Trying to create a test connection with the database."); Configuration configuration = new Configuration(); configuration.configure("hibernate_sp.cfg.xml"); StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()); SessionFactory sessionFactory = configuration.buildSessionFactory(ssrb.build()); Session session = sessionFactory.openSession(); logger.info("Test connection with the database created successfuly."); }
для получения дополнительной информации и подробных сведений вы можете проверить официальный тестовый случай hibernate по адресу https://github.com/hibernate/hibernate-orm/blob/master/hibernate-testing/src/main/java/org/hibernate/testing/junit4/BaseCoreFunctionalTestCase.java функция (buildSessionFactory ()).
попробуйте это!
package your.package; import org.hibernate.HibernateException; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; public class HibernateUtil { private static SessionFactory sessionFactory; private static ServiceRegistry serviceRegistry; static { try { // Configuration configuration = new Configuration(); Configuration configuration = new Configuration().configure(); serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); } catch (HibernateException he) { System.err.println("Error creating Session: " + he); throw new ExceptionInInitializerError(he); } } public static SessionFactory getSessionFactory() { return sessionFactory; } }
Configuration hibConfiguration = new Configuration() .addResource("wp4core/hibernate/config/table.hbm.xml") .configure(); serviceRegistry = new ServiceRegistryBuilder() .applySettings(hibConfiguration.getProperties()) .buildServiceRegistry(); sessionFactory = hibConfiguration.buildSessionFactory(serviceRegistry); session = sessionFactory.withOptions().openSession();
следующее выражает опыт, который я имел с hibernate 4.0.0.Окончательный.
javadoc (распространяется под лицензией LGPL)
org.hibernate.cfg.Configuration
государств-класс:Примечание : это будет заменено на использование
ServiceRegistryBuilder
иorg.hibernate.metamodel.MetadataSources
вместо этого после выпуска 4.0, когда этот класс станет устаревшим и запланированным для удаления в 5.0. Смотрите ЧЧЧ-6183,ЧЧЧ-2578 и HHH-6586 для подробностипосмотрев на проблему 2578, я использовал что-то вроде этого:
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().configure().buildServiceRegistry(); MetadataSources metadataSources = new MetadataSources(serviceRegistry); metadataSources.addResource("some_mapping.hbm.xml") SessionFactory sessionFactory = metadataSources.buildMetadata().buildSessionFactory();
чтобы он начал читать конфигурацию, мне пришлось изменить мою конфигурацию hibernate 3.2.6 и файлы сопоставления для использования
xmlns="http://www.hibernate.org/xsd/hibernate-configuration"
иxmlns="http://www.hibernate.org/xsd/hibernate-mapping"
а также удалите спецификации dtd.Я не мог найти способ для него, чтобы проверить сопоставления, определенные в hibernate.контекстно-свободная грамматика.xml и спящий режим. префикс для свойств, связанных с гибернацией в спящий режим.контекстно-свободная грамматика.xml более не является необязательным.
это может сработать для некоторых.
Я, например, столкнулся с некоторой ошибкой, потому что файлы отображения содержали
<cache usage="read-write" />
и в конечном итоге использовать устаревший способ конфигурации:Configuration configuration = new Configuration().configure(); SessionFactoryImpl sessionFactory = (SessionFactoryImpl) configuration.buildSessionFactory(); EventListenerRegistry listenerRegistry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class); SolrIndexEventListener indexListener = new SolrIndexEventListener(); // a SaveOrUpdateEventListener i wanted to attach listenerRegistry.appendListeners(EventType.SAVE_UPDATE, indexListener);
мне пришлось программно добавлять прослушиватели событий, потому что конфигурация больше не ищет их в спящем режиме.контекстно-свободная грамматика.xml
даже есть обновление в 4.3.0 API. ServiceRegistryBuilder также устарел в 4.3.0 и заменен на StandardServiceRegistryBuilder. Теперь фактический код для создания фабрики сеансов будет выглядеть так пример создания фабрики сеансов.
[цитата из http://www.javabeat.net/session-factory-hibernate-4/]
в Hibernate core framework есть много API, которые устарели. Один из разочаровывающих моментов в это время заключается в том, что официальная документация hibernate не предоставляет четких инструкций о том, как использовать новый API, и она показывает, что документация завершена. Также каждая инкрементная версия получает изменения в некоторых важных API. Одной из таких вещей является новый API для создания фабрики сеансов в Спящий режим 4.3.0 на подопечных. В наших более ранних версиях мы создали фабрику сеансов, как показано ниже:
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
метод buildSessionFactory устарел из выпуска hibernate 4 и он заменен на новый API. Если вы используете hibernate 4.3.0 и выше, ваш код должен быть:
Configuration configuration = new Configuration().configure(); StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()); SessionFactory factory = configuration.buildSessionFactory(builder.build());
класс ServiceRegistryBuilder заменен на StandardServiceRegistryBuilder из 4.3.0. похоже, что будет много изменений в выпуск 5.0. По-прежнему нет большой ясности в отношении устаревших API и подходящих альтернатив для использования. Каждый инкрементный релиз имеет более устаревший API, они находятся в пути тонкой настройки основной платформы для выпуска 5.0.
в более ранних версиях была создана фабрика сеансов, как показано ниже:
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
метод buildSessionFactory является устаревшим, начиная от выхода гибернации 4 и он заменяется на новый API. Если вы используете hibernate 4.3.0 и выше, ваш код должен быть следующим:
Configuration configuration = new Configuration().configure(); StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(). applySettings(configuration.getProperties()); SessionFactory factory = configuration.buildSessionFactory(builder.build());
метод
buildSessionFactory
является устаревшим из выпуска Hibernate 4 и заменяется новым API. Если вы используете Hibernate 4.3.0 и выше, ваш код должен быть:Configuration configuration = new Configuration().configure(); StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder() .applySettings(configuration.getProperties()); SessionFactory factory = configuration.buildSessionFactory(builder.build());