使用Spring,Hibernate和LocalSessionFactoryBuilder配置sessionFactory

时间:2013-02-11 05:27:17

标签: java spring hibernate sessionfactory

我正在尝试使用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();

    }
}

3 个答案:

答案 0 :(得分:9)

ServiceRegistry接口与服务概念相关(这是Hibernate 4的新特性)。服务是为Hibernate提供各种功能的类,用户可以为其插入替代实现。有关详细信息,请参阅this wiki page

你认为方法buildSessionFactory()在Hibernate的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更好的集成。

答案 1 :(得分:0)

你也可以不用链接编写代码:

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

略微冗长但不像@SuppressWarnings那样臭("弃用")

答案 2 :(得分:0)

Artem Shafranov提供的答案并不完全正确,你可能会遇到一个非常混乱的问题。

如果您使用

hibernate.hbm2ddl.auto

您的应用程序将无法启动,因为hbm2dll中的连接池将设置为UserSuppliedConnectionProviderImpl(基本上是一种很好的说法:null)。你会看到这个例外:

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

这个原因与hbm2dll使用的ServiceRegistry有关,但是它与Spring不兼容。使用许多建议的编程会话配置方法,当执行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也失败了。

真的令人困惑的问题。

相关问题