Создать сеанс 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());