[英]Error creating bean LocalSessionFactoryBuilder | spring hibernate
[英]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.