0

アノテーション付きのSpring3.1を使用して、埋め込みHSQLを使用するデータソースを作成しています。

@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)でのみ発生し、Windows7では発生しません。

4

2 に答える 2

1

データベースにデータを入力する @Component Bean で、このように @DependsOn アノテーションを追加する必要があることがわかりました。

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

問題は、すべてのプロパティがきれいに設定されたら、Spring にメソッド メソッドを呼び出させるのではなく、自分でInitializingBeanメソッドメソッドを呼び出していることだと思います。afterPropertiesSet代わりにこれを試してください:

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

これでクリーンなファクトリ Bean になり、Spring が残りのライフサイクルを処理します。

于 2012-10-30T21:27:31.550 に答える