Настройте 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, как ни странно, также не удалось.
очень запутанный вопрос.