2013-02-11 92 views
6

我试图使用spring 3.2和hibernate 4创建sessionFactory bean。我为此使用了以下代码。但问题是buildSessionFactory()已弃用buildSessionFactory(ServiceRegistry serviceRegistry)建议在javadoc中使用。但是,我无法理解什么是ServiceRegistry以及如何使用buildSessionFactory(ServiceRegistry serviceRegistry)使用Spring,Hibernate和LocalSessionFactoryBuilder配置sessionFactory


@Configuration 
public class AppConfig { 

    ... 


    @Bean 
    public SessionFactory sessionFactory() { 
    return new LocalSessionFactoryBuilder(dataSource()) 
     .scanPackages("com.mypackages") 
     .addProperties(hibernateProperties()) 
     
          
  
    .buildSessionFactory(); 
   

    } 
} 

回答

9

ServiceRegistry接口(即对Hibernate 4是新的)相关的服务理念。服务是为Hibernate提供各种功能的类,为此用户可以插入其他实现。有关详细信息,请参见this wiki page

您是对的方法buildSessionFactory()已弃用Hibernate的Configuration类赞成方法buildSessionFactory(ServiceRegistry serviceRegistry)。在纯Hibernate的环境(无春)假设你会以这样的方式初始化的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's LocalSessionFactoryBuilder class只是Hibernate的Configuration类的扩展。但由于Spring的所有具体工作都是在重写方法LocalSessionFactoryBuilder.buildSessionFactory()中完成的,因此在Spring环境中不能使用方法buildSessionFactory(ServiceRegistry serviceRegistry)。没什么可说的,因为使用buildSessionFactory()可以完成相同的工作。所以让我们只标注在AppConfig方法与@SuppressWarnings("deprecation"),耐心等待春天提供与Hibernate更好的集成4.

+0

这个答案是最新的吗? – dtrunk 2013-11-12 14:00:51

+0

@dtrunk如果我没有弄错答案仍然是实际的,即使对于Spring 4.0.0.RC1 – 2013-11-15 13:39:58

0

你也可以写代码,而不链接:

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

稍微详细,但不臭as @SuppressWarnings(“deprecation”)

0

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

如果使用

hibernate.hbm2ddl.auto 

您的应用程序将无法启动,因为在hbm2dll连接池将被设置为UserSuppliedConnectionProviderImpl(基本上是一个很好的方式说:零)。你会看到这个异常:

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

这样做的原因有与所使用的hbm2dll但不使用Spring发挥不错的ServiceRegistry做。使用许多建议的编程式会话配置方法时,当执行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也失败了。

真令人费解的问题。

相关问题