我正在尝试使用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更好的集成。

09-25 22:19