我使用带注释的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上!
答案 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将负责生命周期的其余部分。