在内存数据库中嵌入 HSQL 的 Spring DataSource 和 Linux 上的休眠创建-删除排序

Posted

技术标签:

【中文标题】在内存数据库中嵌入 HSQL 的 Spring DataSource 和 Linux 上的休眠创建-删除排序【英文标题】:Spring DataSource with embedded HSQL in memory database and hibernate create-drop ordering on Linux 【发布时间】:2012-10-30 20:43:17 【问题描述】:

我正在使用带有注释的 Spring 3.1 创建一个使用嵌入式 HSQL 的 DataSource。

@Bean
public DataSource dataSource() throws Exception 
    EmbeddedDatabaseFactoryBean bean = new EmbeddedDatabaseFactoryBean();
    bean.setDatabaseType(EmbeddedDatabaseType.HSQL);
    bean.afterPropertiesSet();
    DataSource object = bean.getObject();
    return object;

我也在这样配置一个SessionFactory

@Bean
public SessionFactory sessionFactory() 
    SessionFactory sessionFactory = new LocalSessionFactoryBuilder(dataSource)
        .setNamingStrategy(namingStrategy())
        .addProperties(hibernateProperties)
        .addAnnotatedClass(Some.class)
        .buildSessionFactory();
    logger.info("Created session factory: " + sessionFactory + " with dataSource: " + dataSource);
    return sessionFactory;

问题是,如果我使用填充数据库的@Component 创建一些其他 bean,SQL 脚本将失败,因为尚未创建数据库。我的 hibernate.properties 包含以下行来生成 DDL

properties.put("hibernate.hbm2ddl.auto", "create-drop");

所以这是 bean 创建的某种排序问题。然而这个问题只发生在 Linux (Kubuntu 12.04) 而不是 Windows 7!

【问题讨论】:

【参考方案1】:

我发现在填充数据库的 @Component bean 中,我必须像这样添加 @DependsOn 注释

@Component
@DependsOn("dataSource", "sessionFactory")
public class DevSqlPopulator 
 ...

【讨论】:

【参考方案2】:

我认为问题在于您自己调用了 InitializingBean 方法 afterPropertiesSet 方法,而不是在所有属性都设置好后让 Spring 调用它。请尝试这样做:

@Bean
public EmbeddedDatabaseFactoryBean dataSource() throws Exception 
    EmbeddedDatabaseFactoryBean bean = new EmbeddedDatabaseFactoryBean();
    bean.setDatabaseType(EmbeddedDatabaseType.HSQL);
    return bean;

现在它是一个干净的工厂 bean,Spring 将负责生命周期的其余部分。

【讨论】:

以上是关于在内存数据库中嵌入 HSQL 的 Spring DataSource 和 Linux 上的休眠创建-删除排序的主要内容,如果未能解决你的问题,请参考以下文章

HSQL 在 Spring 引导测试中不起作用

在内存数据库中使用 Spring Boot 测试

Spring:HSQL-无法执行数据库脚本

在 LightAdmin (Spring/JPA/Hibernate) 中使 HSQL 数据库持久化

在Spring中使用嵌入式数据库-H2

设置 Spring Boot 嵌入式数据库的名称