Quelle est la bonne façon de créer des données de test au démarrage du serveur et de les insérer dans la base de données (j'utilise une instance Postgres soutenue par JPA/JDBC).
De préférence sous forme de création d'entités et de les faire persister via une interface de référentiel plutôt que d'écrire du code SQL simple. Quelque chose comme RoR's Rake db:seed
assistant.
Si le framework expose un hook pour faire des choses lorsque tous les beans ont été injectés et que la base de données est prête, cela pourrait également fonctionner.
Vous pouvez attraper ApplicationReadyEvent
puis insérer des données de démonstration, par exemple:
@Component
public class DemoData {
@Autowired
private final EntityRepository repo;
@EventListener
public void appReady(ApplicationReadyEvent event) {
repo.save(new Entity(...));
}
}
Ou vous pouvez implémenter CommandLineRunner
ou ApplicationRunner
, pour charger les données de démonstration lorsqu'une application est complètement démarrée:
@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(...));
}
}
Ou même implémentez-les comme un droit Bean dans votre classe Application (ou autre classe 'config'):
@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(...));
}
}
}
De la documentation Spring: http://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/htmlsingle/#howto-database-initialization
Initialiser une base de données en utilisant Hibernate Un fichier nommé import.sql à la racine du chemin de classe sera exécuté au démarrage si Hibernate crée le schéma à partir de zéro (c'est-à-dire si la propriété ddl-auto est définie sur create ou create-drop). Cela peut être utile pour les démos et pour les tests si vous faites attention, mais ce n'est probablement pas quelque chose que vous voulez être sur le chemin de classe en production. C'est une fonction Hibernate (rien à voir avec Spring).
Vous pouvez faire comme ça
@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)));
};
}
}