Настройте sessionFactory с помощью Spring, Hibernate и LocalSessionFactoryBuilder

Я пытаюсь создать sessionFactory bean с использованием spring 3.2 и hibernate 4. Для этого я использовал следующий код. Но проблема в том buildSessionFactory() и устаревший и buildSessionFactory(ServiceRegistry serviceRegistry) предлагается использовать вместо этого в javadoc. Однако, я не в состоянии понять, что такое ServiceRegistry и как использовать buildSessionFactory(ServiceRegistry serviceRegistry).


@Configuration
public class AppConfig {

    ...


    @Bean
    public SessionFactory sessionFactory() {
    return new LocalSessionFactoryBuilder(dataSource())
        .scanPackages("com.mypackages")
        .addProperties(hibernateProperties())
        .buildSessionFactory();

    }
}

3 ответов


ServiceRegistry интерфейс связан с концепцией сервисов (что является новым для Hibernate 4). Службы-это классы, которые предоставляют Hibernate различные функциональные возможности и для которых пользователь может подключать альтернативные реализации. См.этой странице для сведения.

вы правы, что метод buildSessionFactory() устарел в спящем режиме Configuration класс в пользу метода buildSessionFactory(ServiceRegistry serviceRegistry). В среде чистого спящего режима (без весны) предполагается, что вы инициализируете пример ServiceRegistry таким образом:

private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;

private static SessionFactory configureSessionFactory() throws HibernateException {
    Configuration configuration = new Configuration();
    configuration.configure();

    serviceRegistry = new ServiceRegistryBuilder()
             .applySettings(configuration.getProperties())
             .buildServiceRegistry();

    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    return sessionFactory;
}

но к настоящему времени устаревший метод buildSessionFactory() и тут же инициализации ServiceRegistry для вас.

весной LocalSessionFactoryBuilder класс - это просто расширение Hibernate в Configuration класса. Но так как вся конкретная работа Spring выполняется в переопределенном методе LocalSessionFactoryBuilder.buildSessionFactory() вы не можете использовать метод buildSessionFactory(ServiceRegistry serviceRegistry) в окружающей среде весны. Ничего особенного, потому что это нормально использовать buildSessionFactory() что делает точно такую же работу. Итак, давайте просто аннотируем метод AppConfig С @SuppressWarnings("deprecation") и терпеливо ждать весны, чтобы обеспечить лучшую интеграцию с Hibernate 4.


вы также можете написать код без цепочки:

LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource());
builder.scanPackages("com.mypackages");
builder.addProperties(hibernateProperties());
return builder.buildSessionFactory();

немного более подробный, но не такой вонючий, как @SuppressWarnings ("deprecation")


ответ, предоставленный Артемом шафрановым, не совсем правильный,и вы можете столкнуться с очень запутанной проблемой, как и я.

Если вы используете

hibernate.hbm2ddl.auto

ваше приложение не запустится, потому что пул соединений в hbm2dll будет установлен в UserSuppliedConnectionProviderImpl (в основном хороший способ сказать: null). Вы увидите это исключение:

org.hibernate.service.UnknownUnwrapTypeException: Cannot unwrap to requested type [javax.sql.DataSource]

причина этого связана с ServiceRegistry, который используется hbm2dll, но который не очень-то хорошо с весной. Используя многие из предложенных методов конфигурации программного сеанса, он еще не будет иметь надлежащей ссылки при выполнении hbm2dll.

единственный способ, который сработал для меня, это следующее

@Inject
DataSource datasource;

@Bean
@SuppressWarnings("deprecation")
public SessionFactory sessionFactory() throws IOException{

    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setPackagesToScan("nl.your.model");
    sessionFactoryBean.setHibernateProperties(hibernateProperties());
    sessionFactoryBean.setDataSource(datasource);
    sessionFactoryBean.afterPropertiesSet();

    return sessionFactoryBean.getObject();
}

не удалось использовать LocalSessionFactoryBuilder. Использование StandardServiceRegistryBuilder, как ни странно, также не удалось.

очень запутанный вопрос.