Me pregunto cuál es la mejor manera de cargar los datos iniciales de la base de datos antes de que se inicie la aplicación. Lo que estoy buscando es algo que llene mi base de datos H2 con datos.
Por ejemplo, tengo un modelo de dominio "Usuario". Puedo acceder a los usuarios yendo a / users pero inicialmente no habrá ningún usuario en la base de datos, así que tengo que crearlos. ¿Hay alguna forma de llenar la base de datos con datos automáticamente?
Por el momento, tengo un Bean que el contenedor crea instancias y crea usuarios para mí.
Ejemplo:
@Component
public class DataLoader {
private UserRepository userRepository;
@Autowired
public DataLoader(UserRepository userRepository) {
this.userRepository = userRepository;
LoadUsers();
}
private void LoadUsers() {
userRepository.save(new User("lala", "lala", "lala"));
}
}
Pero dudo mucho que sea la mejor manera de hacerlo. ¿O es eso?
spring
spring-boot
spring-data
Lithicas
fuente
fuente
data.sql
y / oschema.sql
iniciará datos. Todo esto está documentado en la guía de referencia (que sugiero leer).Respuestas:
Simplemente puede crear un archivo data.sql en su carpeta src / main / resources y se ejecutará automáticamente al inicio. En este archivo solo agrega algunas instrucciones de inserción, por ejemplo:
Del mismo modo, también puede crear un archivo schema.sql (o schema-h2.sql) para crear su esquema:
Aunque normalmente no debería tener que hacer esto ya que Spring boot ya configura Hibernate para crear su esquema basado en sus entidades para una base de datos en memoria. Si realmente desea usar schema.sql, tendrá que deshabilitar esta característica agregando esto a su application.properties:
Se puede encontrar más información en la documentación sobre la inicialización de la base de datos .
Si está utilizando Spring boot 2 , la inicialización de la base de datos solo funciona para bases de datos integradas (H2, HSQLDB, ...). Si desea usarlo también para otras bases de datos, debe cambiar la
spring.datasource.initialization-mode
propiedad:Si está utilizando múltiples proveedores de bases de datos, puede nombrar su archivo data-h2.sql o data-mysql.sql dependiendo de la plataforma de base de datos que desee usar.
Sin
spring.datasource.platform
embargo, para que eso funcione, deberá configurar la propiedad:fuente
schema.sql
/data.sql
se ejecutarán cuandospring.datasource.initialize
seatrue
(que es el valor predeterminado).spring.jpa.hibernate.ddl-auto
puede usarse para generar sus tablas en función de la configuración de su entidad en lugar de usar un archivo SQL. Esto está habilitado por defecto en las bases de datos en memoria. Es por eso que agregué la nota en mi respuesta, explicando que si usa una base de datos en memoria y desea usarlaschema.sql
, debe deshabilitarla; de lospring.jpa.hibernate.ddl-auto
contrario, ambos intentarán crear su tabla.data-h2.sql
nombre de archivo para sus datos iniciales, también debe establecer lasspring.datasource.platform=h2
propiedades de su aplicación.org.h2.jdbc.JdbcSQLException
excepción, porque los datos ya están presentes en la base de datos. Estoy usando una base de datos H2 incrustada, pero el problema sigue siendo el mismo.MERGE INTO
. Me di cuenta de que hay una manera de evitar esto usando un archivo import.sql en lugar de un data.sql . Se requierespring.jpa.hibernate.ddl-auto
a crear o crear soltar . Luego, cada vez que se crea el archivo de esquema (y / o se ejecuta un schema.sql ), también se ejecuta import.sql . Aún así: parece una solución alternativa y no una implementación limpia de la creación de datos de inicio.Si solo quiero insertar datos de prueba simples, a menudo implemento a
ApplicationRunner
. Las implementaciones de esta interfaz se ejecutan al inicio de la aplicación y pueden usar, por ejemplo, un repositorio con conexión automática para insertar algunos datos de prueba.Creo que dicha implementación sería un poco más explícita que la suya porque la interfaz implica que su implementación contiene algo que le gustaría hacer directamente después de que su aplicación esté lista.
Su implementación se vería algo. Me gusta esto:
fuente
Como sugerencia intente esto:
Opción 2: inicializar con esquemas y scripts de datos
Prerrequisitos: en esto
application.properties
debes mencionar esto:spring.jpa.hibernate.ddl-auto=none
(de lo contrario las secuencias de comandos serán ignorados por hibernación, y se explorará proyecto para@Entity
y / o@Table
clases anotadas)Luego, en tu
MyApplication
clase, pega esto:Dónde
scripts
se encuentra laresources
carpeta debajo de la carpeta (IntelliJ Idea)Espero que ayude a alguien
fuente
Puede agregar una
spring.datasource.data
propiedad paraapplication.properties
enumerar los archivos sql que desea ejecutar. Me gusta esto:Las instrucciones de inserción sql en cada uno de estos archivos se ejecutarán, permitiéndole mantener las cosas ordenadas.
Si coloca los archivos en el classpath, por ejemplo
src/main/resources
, se aplicarán. O reemplaceclasspath:
confile:
y use una ruta absoluta al archivofuente
file:
lugar declasspath:
.Puedes usar algo como esto:
fuente
Spring Boot le permite usar un script simple para inicializar su base de datos, utilizando Spring Batch .
Aún así, si desea usar algo un poco más elaborado para administrar versiones de DB, etc., Spring Boot se integra bien con Flyway .
Ver también:
fuente
En Spring Boot 2 data.sql no funcionaba conmigo como en spring boot 1.5
Además, un archivo nombrado
import.sql
en la raíz del classpath se ejecuta al inicio si Hibernate crea el esquema desde cero (es decir, si la propiedad ddl-auto está configurada para crear o crear-soltar).Tenga en cuenta que es muy importante que si inserta las claves no se pueden duplicar, no use la propiedad ddl-auto está configurada para actualizar porque con cada reinicio insertará los mismos datos nuevamente
Para más información visita primavera websit
https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html
fuente
Aquí está la forma en que obtuve eso:
Gracias al autor de este artículo:
http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/
fuente
Simplemente puede crear un
import.sql
archivosrc/main/resources
e Hibernate lo ejecutará cuando se cree el esquema.fuente
Resolví un problema similar de esta manera:
fuente
Si alguien está luchando para que esto funcione incluso después de la respuesta aceptada , para mí solo trabajo agregando mis detalles
src/test/resources/application.yml
H2datasource
:fuente
puedes registrarte y escuchar el evento para lograr eso como a continuación:
Cuando se activa ContextRefreshEvent, tenemos acceso a todos los beans con conexión automática en la aplicación, incluidos los modelos y repositorios.
fuente
Si desea insertar solo algunas filas y tiene la configuración JPA. Puedes usar a continuación
fuente
Esto también funcionará.
fuente
El más compacto (para datos dinámicos) puso la solución @ mathias-dpunkt en MainApp (con Lombok
@AllArgsConstructor
):fuente
¡Ya casi estás ahí!
fuente
Puedes usar el siguiente código. En el siguiente código, se produce una inserción de la base de datos durante el inicio de la aplicación de inicio de Spring.
fuente