2017-06-25 9 views
1

サーバ起動時にテストデータを作成し、データベースに挿入する正しい方法は何ですか(私はJPA/JDBCバックアップPostgresインスタンスを使用しています)。Springブートは、起動時にデータベースにサンプルデータを挿入します。

エンティティを作成し、プレーンなSQLコードを記述するのではなく、リポジトリ・インタフェースを介して永続化するという形で行うことが好ましい。 RoRのRake db:seedヘルパーのようなもの。

すべてのBeanが注入され、データベースが準備されているときにフレームワークが作業を行うためのフックを公開している場合、それも機能する可能性があります。春のドキュメントから

+0

それがあなたを助けた場合、答えを受け入れることを忘れないでください。 – Cepr0

答えて

3

次の例のように、デモデータを挿入しApplicationReadyEventをキャッチすることができます:

@Component 
public class DemoData { 

    @Autoware   
    private final EntityRepository repo; 

    @EventListener 
    public void appReady(ApplicationReadyEvent event) { 

     repo.save(new Entity(...)); 
    } 
} 

それとも、アプリケーションが完全に起動したとき、デモデータをロードするために、CommandLineRunnerまたはApplicationRunnerを実装できます。

@Component 
public class DemoData implements CommandLineRunner { 

    @Autoware 
    private final EntityRepository repo; 

    @Override 
    public void run(String...args) throws Exception { 

     repo.save(new Entity(...)); 
    } 
} 

@Component 
public class DemoData implements ApplicationRunner { 

    @Autoware 
    private final EntityRepository repo; 

    @Override 
    public void run(ApplicationArguments args) throws Exception { 

     repo.save(new Entity(...)); 
    } 
} 

また、アプリケーション(または他の 'config')クラスのBeanのように実装することもできます:

@SpringBootApplication 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @Bean 
    public CommandLineRunner demoData(EntityRepository repo) { 
     return args -> { 

      repo.save(new Entity(...)); 
     } 
    } 
} 
+0

に従って達成しようとしているものの唯一の解決策です。これは私が探していたより感謝しています。 – DarthPaghius

1

http://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/htmlsingle/#howto-database-initialization

は、Hibernateは最初からスキーマを作成した場合、クラスパスのルートにimport.sqlという名前のファイルが(起動時に実行されます休止状態 を使用してデータベースを初期化しますつまり、ddl-autoプロパティがcreateまたはdrop-dropに設定されている場合)。これは、デモや慎重にテストするのに便利ですが、実際には本番環境のクラスパス上にあることは望ましくありません。これはHibernateの機能です(Springとは関係ありません)。

+0

クラスパスのルートとは何ですか? srcフォルダのルート?私はこの定義がビルドツール/プラットフォームに依存していると考えているからです。 – DarthPaghius

+0

Mavenを使用している場合、次のようなフォルダがあります。/ src/main/resources @Parsoa –

+0

ありがとうございます。とにかく、このアプローチは非常にエラーが発生しやすく、挿入する必要があるデータの量に時間がかかるようです。 Javaソリューションがあれば、私はそれが良いと思います。 – DarthPaghius

関連する問題