Создать сеанс factory в Hibernate 4
У меня возникла проблема с созданием сеанса factory в Hibernate 4. В Hibernate 3 я просто сделал:
org.hibernate.cfg.Configuration conf= HibernateUtil
.getLimsInitializedConfiguration(systemConfiguration
.getHibernateconfFile());
SessionFactory sf = conf.configure().buildSessionFactory();
Теперь мне нужно передать класс ServiceRegistry для buildSessionFactory, но Javadocs крайне расплывчаты в том, как это сделать. Любые советы?
Ответы
Ответ 1
Да, они устарели предыдущий API buildSessionFactory, и это довольно легко сделать хорошо.. вы можете сделать что-то вроде этого.
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.");
}
Для более подробной и подробной информации вы можете проверить официальный тестовый пример спящего режима на https://github.com/hibernate/hibernate-orm/blob/master/hibernate-testing/src/main/java/org/hibernate/testing/junit4/BaseCoreFunctionalTestCase.java function (buildSessionFactory()).
Ответ 2
Попробуйте это!
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;
}
}
Ответ 3
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();
Ответ 4
Следующее выражает опыт, который у меня был с hibernate 4.0.0.Final.
В javadoc (распространяется по лицензии LGPL) класса org.hibernate.cfg.Configuration
указано, что:
ПРИМЕЧАНИЕ. Это будет заменено использованием ServiceRegistryBuilder
и org.hibernate.metamodel.MetadataSources
вместо версии 4.0, после чего этот класс станет устаревшим и запланирован для удаления в 5.0. См. HHH-6183, HHH-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.cfg.xml и спящем режиме. префикс для связанных с гибернацией свойств в hibernate.cfg.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);
Мне пришлось программно добавлять прослушиватели событий, потому что Configuration больше не ищет их в hibernate.cfg.xml
Ответ 5
Даже в версии 4.3.0 есть обновление. ServiceRegistryBuilder также устарел в 4.3.0 и заменен стандартнымServiceRegistryBuilder. Теперь фактический код для создания сеанса factory будет выглядеть следующим образом при создании сеанса factory.
Ответ 6
[цитата из http://www.javabeat.net/session- factory -hibernate-4/]
Существует много API-интерфейсов, устаревших в структуре ядра hibernate. В настоящее время одним из разочаровывающих моментов является то, что официальная документация hibernate не дает четких инструкций о том, как использовать новый API, и указывает, что документация завершена. Также каждая инкрементная версия получает изменения в некоторых важных API. Одним из таких вещей является новый API для создания сеанса factory в Hibernate 4.3.0 на компьютерах. В наших предыдущих версиях мы создали сеанс factory, как показано ниже:
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Метод buildSessionFactory устарел из версии hibernate 4, и он заменяется новым API. Если вы используете спящий режим 4.3.0 и выше, ваш код должен быть:
Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory factory = configuration.buildSessionFactory(builder.build());
Класс ServiceRegistryBuilder заменен стандартнымServiceRegistryBuilder из 4.3.0. Похоже, что в версии 5.0 будет много изменений. Тем не менее, нет ясности в отношении устаревших API и подходящих альтернатив для использования. Каждый инкрементный выпуск содержит более устаревший API, они в состоянии тонкой настройки базовой структуры для выпуска 5.0.
Ответ 7
Метод 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());
Ответ 8
В более ранних версиях сеанс factory был создан следующим образом:
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Метод buildSessionFactory устарел из версии hibernate 4 и заменен новым API. Если вы используете спящий режим 4.3.0 и выше, ваш код должен выглядеть следующим образом:
Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().
applySettings(configuration.getProperties());
SessionFactory factory = configuration.buildSessionFactory(builder.build());