Gostaria de saber qual é a melhor maneira de carregar dados iniciais do banco de dados antes do aplicativo iniciar? O que estou procurando é algo que preencha meu banco de dados H2 com dados.
Por exemplo, eu tenho um modelo de domínio "Usuário". Posso acessar os usuários acessando / users, mas inicialmente não haverá usuários no banco de dados, então tenho que criá-los. Existe alguma maneira de preencher o banco de dados com dados automaticamente?
No momento, tenho um Bean que é instanciado pelo contêiner e cria usuários para mim.
Exemplo:
@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"));
}
}
Mas duvido muito que seja a melhor maneira de fazê-lo. Ou é?
spring
spring-boot
spring-data
Lithicas
fonte
fonte
data.sql
e / ouschema.sql
iniciará dados. Tudo isso está documentado no guia de referência (que eu sugiro que leia).Respostas:
Você pode simplesmente criar um arquivo data.sql na pasta src / main / resources e ele será executado automaticamente na inicialização. Neste arquivo, você apenas adiciona algumas instruções de inserção, por exemplo:
Da mesma forma, você pode criar um arquivo schema.sql (ou schema-h2.sql) para criar seu esquema:
Embora normalmente você não precise fazer isso, pois a inicialização do Spring já configura o Hibernate para criar seu esquema com base em suas entidades para um banco de dados na memória. Se você realmente deseja usar o schema.sql, precisará desativar esse recurso adicionando-o ao seu application.properties:
Mais informações podem ser encontradas na documentação sobre inicialização do banco de dados .
Se você estiver usando o Spring boot 2 , a inicialização do banco de dados funcionará apenas para bancos de dados incorporados (H2, HSQLDB, ...). Se você quiser usá-lo para outros bancos de dados, precisará alterar a
spring.datasource.initialization-mode
propriedade:Se você estiver usando vários fornecedores de banco de dados, poderá nomear seu arquivo data-h2.sql ou data-mysql.sql dependendo da plataforma de banco de dados que deseja usar.
Para fazer isso funcionar, você precisará configurar a
spring.datasource.platform
propriedade:fonte
schema.sql
/data.sql
serão executados quandospring.datasource.initialize
estãotrue
(que é o padrão).spring.jpa.hibernate.ddl-auto
pode ser usado para gerar suas tabelas com base na configuração da sua entidade, em vez de usar um arquivo SQL. Por padrão, isso está ativado nos bancos de dados em memória. É por isso que adicionei a nota na minha resposta, explicando que, se você usa um banco de dados na memória e deseja usá-schema.sql
lo, precisa desativar,spring.jpa.hibernate.ddl-auto
caso contrário, ambos tentarão criar sua tabela.data-h2.sql
nome do arquivo para seus dados iniciais, definaspring.datasource.platform=h2
também as propriedades do aplicativo.org.h2.jdbc.JdbcSQLException
exceção, porque os dados já estão presentes no banco de dados. Estou usando um banco de dados H2 incorporado, mas o problema permanece o mesmo.MERGE INTO
. Eu descobri que existe uma maneira de contornar isso usando um arquivo import.sql em vez de um data.sql . Ela exigespring.jpa.hibernate.ddl-auto
a criar ou criar-drop . Então, sempre que o arquivo do esquema for criado (e / ou um schema.sql for executado), o import.sql também será executado. Ainda: parece uma solução alternativa e não uma implementação limpa da criação de dados init.Se eu apenas quiser inserir dados de teste simples, implementei
ApplicationRunner
. As implementações dessa interface são executadas na inicialização do aplicativo e podem usar, por exemplo, um repositório com conexão automática para inserir alguns dados de teste.Acho que essa implementação seria um pouco mais explícita que a sua, porque a interface implica que sua implementação contém algo que você gostaria de fazer diretamente depois que seu aplicativo estivesse pronto.
Sua implementação seria sth. como isso:
fonte
Como sugestão, tente o seguinte:
Opção 2: inicializar com scripts de esquema e dados
Pré-requisitos:
application.properties
você deve mencionar isso:spring.jpa.hibernate.ddl-auto=none
(caso contrário, os scripts serão ignorados pelo hibernate e verificarão o projeto em busca de classes@Entity
e / ou@Table
anotadas)Em seguida, em sua
MyApplication
classe, cole este:Onde a
scripts
pasta está localizada naresources
pasta (IntelliJ Idea)Espero que ajude alguém
fonte
Você pode adicionar uma
spring.datasource.data
propriedade paraapplication.properties
listar os arquivos sql que deseja executar. Como isso:As instruções sql insert em cada um desses arquivos serão executadas, permitindo que você mantenha as coisas organizadas.
Se você colocar os arquivos no caminho de classe, por exemplo,
src/main/resources
eles serão aplicados. Ou substituaclasspath:
porfile:
e use um caminho absoluto para o arquivofonte
file:
vez declasspath:
.Você pode usar algo como isto:
fonte
O Spring Boot permite que você use um script simples para inicializar seu banco de dados, usando o Spring Batch .
Ainda assim, se você deseja usar algo um pouco mais elaborado para gerenciar versões de banco de dados e assim por diante, o Spring Boot se integra bem ao Flyway .
Veja também:
fonte
No Spring Boot 2, o data.sql não estava funcionando comigo, como no Spring Boot 1.5
Além disso, um arquivo nomeado
import.sql
na raiz do caminho de classe é executado na inicialização se o Hibernate criar o esquema do zero (ou seja, se a propriedade ddl-auto estiver configurada para criar ou criar e soltar).Observe muito importante se você inserir Chaves não puderem ser duplicadas, não use a propriedade ddl-auto configurada para atualizar, pois a cada reinicialização, os mesmos dados serão inseridos novamente.
Para mais informações, visite o site Spring Websit
https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html
fonte
Aqui está a maneira que eu consegui isso:
Graças ao autor deste artigo:
http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/
fonte
Você pode simplesmente criar um
import.sql
arquivosrc/main/resources
e o Hibernate o executará quando o esquema for criado.fonte
Resolvi um problema semelhante desta maneira:
fonte
Se alguém está lutando para que isso funcione, mesmo seguindo a resposta aceita , para mim só trabalho adicionando meus detalhes
src/test/resources/application.yml
do H2datasource
:fonte
você pode se registrar e ouvir eventos para conseguir isso como abaixo:
Quando o ContextRefreshEvent é acionado, obtemos acesso a todos os beans conectados automaticamente no aplicativo - incluindo modelos e repositórios.
fonte
Se você deseja inserir apenas algumas linhas e você tem a Instalação JPA. Você pode usar abaixo
fonte
Isso também irá funcionar.
fonte
A solução mais compacta (para dados dinâmicos) colocou a solução @ mathias-dpunkt no MainApp (com Lombok
@AllArgsConstructor
):fonte
Você está quase lá!
fonte
Você pode usar o código abaixo. No código a seguir, ocorre uma inserção de banco de dados durante a inicialização do aplicativo de inicialização por mola.
fonte