Paghillect
Paghillect

Reputation: 848

Spring Boot insert sample data into database upon startup

What is the right way for creating test data upon server startup and inserting them into the database (I'm using a JPA/JDBC backed Postgres instance).

Preferably in form of creating Entities and having them persisted through a Repository interface rather than writing plain SQL code. Something like RoR's Rake db:seed helper.

If the framework exposes a hook for doing stuff when all the beans have been injected and the database is ready, that could also work.

Upvotes: 17

Views: 36670

Answers (3)

Cepr0
Cepr0

Reputation: 30339

You can catch ApplicationReadyEvent then insert demo data, for example:

@Component
public class DemoData {

    @Autowired
    private final EntityRepository repo;

    @EventListener
    public void appReady(ApplicationReadyEvent event) {

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

Or you can implement CommandLineRunner or ApplicationRunner, to load demo data when an application is fully started:

@Component
public class DemoData implements CommandLineRunner {

    @Autowired
    private final EntityRepository repo;

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

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

@Component
public class DemoData implements ApplicationRunner {

    @Autowired
    private final EntityRepository repo;

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

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

Or even implement them like a Bean right in your Application (or other 'config') class:

@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(...));
        }
    }
}

Upvotes: 49

Udara S.S Liyanage
Udara S.S Liyanage

Reputation: 6453

You can do like this

    @SpringBootApplication
    public class H2Application {

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

        @Bean
        CommandLineRunner init (StudentRepo studentRepo){
            return args -> {
                List<String> names = Arrays.asList("udara", "sampath");
                names.forEach(name -> studentRepo.save(new Student(name)));
            };
        }
    }

Upvotes: 4

Moshe Arad
Moshe Arad

Reputation: 3733

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

Initialize a database using Hibernate A file named import.sql in the root of the classpath will be executed on startup if Hibernate creates the schema from scratch (that is if the ddl-auto property is set to create or create-drop). This can be useful for demos and for testing if you are careful, but probably not something you want to be on the classpath in production. It is a Hibernate feature (nothing to do with Spring).

Upvotes: 8

Related Questions