Создать фабрику сессий в Hibernate 4 - PullRequest
62 голосов
/ 03 ноября 2011

У меня проблемы с генерацией фабрики сессий в Hibernate 4. В Hibernate 3 я просто сделал:

org.hibernate.cfg.Configuration conf= HibernateUtil
    .getLimsInitializedConfiguration(systemConfiguration
.getHibernateconfFile());

SessionFactory sf = conf.configure().buildSessionFactory();

Теперь мне нужно передать класс ServiceRegistry для buildSessionFactory, но Javadocs крайне расплывчаты в том, как это сделать. Любые советы?

Ответы [ 8 ]

70 голосов
/ 28 мая 2012

Да, они отказались от предыдущего API buildSessionFactory, и это довольно легко сделать хорошо ... вы можете сделать что-то вроде этого ..

РЕДАКТИРОВАТЬ : 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 ()).

18 голосов
/ 24 сентября 2012

Попробуйте!

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;
    } 
}
11 голосов
/ 23 мая 2012
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();
7 голосов
/ 15 декабря 2011

Ниже приведен опыт работы с 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. Префикс для свойств, связанных с hibernate в hibernate.cfg.xml is больше не является обязательным.

Для некоторых это может работать.

Я, например, столкнулся с некоторой ошибкой, поскольку файлы сопоставления содержали <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);

Мне пришлось программно добавлять прослушиватели событий, потому что Конфигурация больше не ищет их в hibernate.cfg.xml

5 голосов
/ 25 декабря 2013

Даже есть обновление в 4.3.0 API.ServiceRegistryBuilder также устарела в 4.3.0 и заменена на StandardServiceRegistryBuilder.Теперь фактический код для создания фабрики сеансов будет выглядеть следующим образом при создании фабрики сеансов .

2 голосов
/ 03 февраля 2014

[цитата из http://www.javabeat.net/session-factory-hibernate-4/]

В структуре ядра hibernate устарело множество API. Одним из разочаровывающих моментов в настоящее время является то, что официальная документация спящего режима не содержит четких инструкций по использованию нового API, а также сообщает, что документация завершена. Также каждая инкрементная версия получает изменения в некоторых важных API. Одной из таких вещей является новый API для создания фабрики сессий в Hibernate 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.

1 голос
/ 22 января 2016

Метод 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());
1 голос
/ 27 июля 2014

В более ранних версиях фабрика сессий создавалась следующим образом:

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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...