我正在尝试使用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())
}
}
最佳答案
ServiceRegistry
接口(interface)与服务的概念有关(对于Hibernate 4是新的)。服务是为Hibernate提供各种功能的类,用户可以为它们插入替代的实现。有关详细信息,请参见this wiki page。
没错,Hibernate的buildSessionFactory()
类不赞成使用Configuration
方法,而推荐使用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()
可以完成完全相同的工作是可以的。因此,让我们仅用AppConfig
注释@SuppressWarnings("deprecation")
中的方法,并耐心等待Spring提供与Hibernate 4更好的集成。