0

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

4

2 回答 2

1

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

@Component
@DependsOn({"dataSource", "sessionFactory"})
public class DevSqlPopulator {
 ...
}
于 2012-10-31T13:54:04.207 回答
0

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

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

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

于 2012-10-30T21:27:31.550 回答