与Spring,Hibernate和LocalSessionFactoryBuilder配置Sess

2019-07-19 16:58发布

我试图创建sessionFactory使用弹簧3.2豆和休眠4.我用下面的代码为。 但问题是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();

    }
}

Answer 1:

ServiceRegistry接口(即对Hibernate 4是新的)相关的服务理念。 服务是提供休眠与各种功能和用于其中用户可在替代实施方式中插塞类。 请参阅此wiki页面了解详情。

你是正确的,方法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的LocalSessionFactoryBuilder类是Hibernate的只是扩展Configuration类。 但是,由于所有的Spring的具体工作覆盖方法完成LocalSessionFactoryBuilder.buildSessionFactory()不能使用方法buildSessionFactory(ServiceRegistry serviceRegistry)在Spring的环境。 没什么“因为它是确定使用buildSessionFactory()是不完全一样的工作。 所以让我们只标注在方法AppConfig@SuppressWarnings("deprecation")耐心等待春天提供与Hibernate 4更好的集成。



Answer 2:

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

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

稍微详细,但不是臭的@SuppressWarnings(“弃用”)



Answer 3:

由阿尔乔姆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,令人惊讶,也失败了。

真正令人困惑的问题。



文章来源: Configure sessionFactory with Spring, Hibernate and LocalSessionFactoryBuilder