6

我正在尝试sessionFactory使用 spring 3.2 和 hibernate 4 创建 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();

    }
}
4

3 回答 3

9

ServiceRegistry接口与服务的概念有关(对于 Hibernate 4 来说是新的)。服务是为 Hibernate 提供各种功能并且用户可以插入替代实现的类。有关详细信息,请参阅此 wiki 页面

你是对的,buildSessionFactory()在 Hibernate 的Configuration类中不推荐使用 method 来支持 method 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()因此您不能buildSessionFactory(ServiceRegistry serviceRegistry)在 Spring 的环境中使用方法。没什么,因为可以使用buildSessionFactory()它做完全相同的工作。所以让我们在AppConfigwith中注解该方法,@SuppressWarnings("deprecation")并耐心等待 Spring 提供与 Hibernate 4 的更好集成。

于 2013-05-05T07:26:46.627 回答
0

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

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

稍微冗长但不像 @SuppressWarnings("deprecation")

于 2014-05-07T14:08:33.643 回答
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 也失败了。

真是令人困惑的问题。

于 2015-11-13T18:15:01.200 回答