繁体   English   中英

使用Spring,Hibernate和LocalSessionFactoryBuilder配置sessionFactory

[英]Configure sessionFactory with Spring, Hibernate and LocalSessionFactoryBuilder

我正在尝试使用spring 3.2和hibernate 4创建sessionFactory bean。我使用了以下代码。 但问题是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(); 
  

    }
}

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

你是对的,在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()完成的, LocalSessionFactoryBuilder.buildSessionFactory()在Spring的环境中不能使用方法buildSessionFactory(ServiceRegistry serviceRegistry) 没什么用的,因为使用buildSessionFactory()完成同样的工作是可以的。 因此,让我们使用@SuppressWarnings("deprecation")AppConfig注释该方法,并耐心等待Spring提供与Hibernate 4的更好集成。

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

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

稍微冗长但不像@SuppressWarnings那样臭(“弃用”)

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也失败了。

真是令人困惑的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM