在内存数据库中嵌入 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 上的休眠创建-删除排序的主要内容,如果未能解决你的问题,请参考以下文章