我正在尝试使用
spring 3.2和hibernate 4创建sessionFactory bean.我使用了以下代码.但问题是不推荐使用buildSessionFactory(),建议在
javadoc中使用buildSessionFactory(ServiceRegistry serviceRegistry).但是,我无法理解什么是ServiceRegistry以及如何使用buildSessionFactory(ServiceRegistry serviceRegistry).
@Configuration
public class AppConfig {
...
@Bean
public SessionFactory sessionFactory() {
return new LocalSessionFactoryBuilder(dataSource())
.scanPackages("com.mypackages")
.addProperties(hibernateProperties())
.buildSessionFactory();
}
}
解决方法
ServiceRegistry接口与服务概念相关(这是Hibernate 4的新特性).服务是为Hibernate提供各种功能的类,用户可以为其插入替代实现.有关详情,请参见
this wiki page.
你是对的,在Hibernate的Configuration类中不推荐使用方法buildSessionFactory(),而使用方法buildSessionFactory(ServiceRegistry serviceRegistry).在纯Hibernate的环境中(没有Spring),假设您将以这样的方式初始化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初始化.
Spring的LocalSessionFactoryBuilder类只是Hibernate的Configuration类的扩展.但是由于Spring的所有特定工作都是在重载方法LocalSessionFactoryBuilder.buildSessionFactory()中完成的,所以在Spring的环境中不能使用方法buildSessionFactory(ServiceRegistry serviceRegistry).没什么用的,因为使用buildSessionFactory()完成同样的工作是可以的.因此,让我们使用@SuppressWarnings(“弃用”)在AppConfig中注释该方法,并耐心等待Spring提供与Hibernate 4的更好集成.