我正在尝试使用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();
}
}
答案 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也失败了。
真的令人困惑的问题。