2013-02-11 96 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也失敗了。

真令人費解的問題。

相關問題