Spring DataSource在内存数据库中嵌入了HSQL,在Linux上使用了hibernate create-drop顺序

时间:2012-10-30 20:43:17

标签: linux spring hibernate hsqldb sessionfactory

我使用带注释的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上!

2 个答案:

答案 0 :(得分:1)

我已经知道在我填充数据库的@Component bean中我必须像这样添加@DependsOn注释

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

答案 1 :(得分:0)

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

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

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