Создать завод в Hibernate 4


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

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

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

теперь мне нужно передать класс ServiceRegistry в buildSessionFactory, но Javadocs чрезвычайно расплывчаты о том, как это сделать. Какие-нибудь советы?

8 61

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());