2016-06-26 22 views
41

Mi chiedo quale sia il modo migliore per caricare i dati del database iniziale prima dell'avvio dell'applicazione. Quello che sto cercando è qualcosa che riempirà il mio database H2 con i dati.Avvio a molla - Caricamento dati iniziali

Ad esempio, ho un modello di dominio "Utente" Posso accedere agli utenti visitando/utenti ma inizialmente non ci saranno utenti nel database, quindi devo crearli. Esiste comunque la possibilità di riempire automaticamente il database con i dati?

Al momento ho un bean che viene istanziato dal contenitore e crea utenti per me.

Esempio:

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

Ma dubito molto che è il miglior modo di farlo. O è?

+3

Che funzionerà, o semplicemente aggiungere 'data.sql' e/o' schema.sql' per iniziare i dati .. Tutto questo è [documentato] (http://docs.spring.io/spring-boot/docs/current /reference/html/howto-database-initialization.html) nella guida di riferimento (che suggerisco di leggere). –

+0

Si prega di segnare la risposta corretta se questo ti ha aiutato. – Reborn

+0

Qualcuno ha capito? Non riesco ancora a metterlo insieme e non sono sicuro di ciò che mi manca qui. https://git.io/v5SWx – Srini

risposta

8

Spring Boot consente di utilizzare un semplice script per inizializzare il database, utilizzando Spring Batch.

Tuttavia, se si desidera utilizzare qualcosa di un po 'più elaborato per gestire le versioni DB e così via, Spring Boot si integra perfettamente con Flyway.

Consulta anche:

59

si può semplicemente creare un file di data.sql (o data-h2.sql se desideri solo di essere applicato nel caso in cui H2 è il tuo database) nella tua cartella src/main/resources e verrà eseguito automaticamente all'avvio. In questo file si aggiunge solo alcune istruzioni di inserimento, ad es .:

INSERT INTO users (username, firstname, lastname) VALUES 
    ('lala', 'lala', 'lala'), 
    ('lolo', 'lolo', 'lolo'); 

Allo stesso modo, è possibile creare un file dischema.sql (o schema-h2.sql), nonché per creare lo schema:

CREATE TABLE task (
    id   INTEGER PRIMARY KEY, 
    description VARCHAR(64) NOT NULL, 
    completed BIT NOT NULL); 

Anche se di norma non si dovrebbe avere a che fare questo dato avvio primavera configura già Hibernate per creare lo schema in base alle proprie entità per un in-memory database. Se davvero si vuole utilizzare schema.sql dovrete disattivare questa funzione aggiungendo questo ai tuoi application.properties:

spring.jpa.hibernate.ddl-auto=none 

Maggiori informazioni possono essere trovate presso la documentazione su Database initialization.

+0

Grazie @ g00glen00b per la cancellazione: "e verrà eseguito automaticamente all'avvio". Stavo ricevendo degli errori mentre includevo il file data.sql nella configurazione del mio bean usando l'opzione addScript (s). A questo punto lo schema non era ancora stato costruito. –

+0

Ho riscontrato problemi con la sequenza di creazione degli oggetti DB e l'esecuzione di data.sql. Lo script viene eseguito prima di creare le entità db. Ecco il mio post sul problema: https: //stackoverflow.com/questions/38040572/spring-boot-loading-initial-data? Rq = 1 – Srini

+0

Sembra che il collegamento precedente non sia corretto. https://stackoverflow.com/questions/46066575/spring-boot-data-initialization Ho anche creato un progetto di esempio che evidenzia il problema. https://git.io/v5SWx – Srini

35

Se voglio solo inserire semplici dati di test, spesso implemento uno ApplicationRunner. Le implementazioni di questa interfaccia vengono eseguite all'avvio dell'applicazione e possono essere utilizzate per es. un repository autowired per inserire alcuni dati di test.

Penso che un'implementazione di questo tipo sarebbe leggermente più esplicativa della tua perché l'interfaccia implica che la tua implementazione contenga qualcosa che vorresti fare direttamente dopo che l'applicazione è pronta.

L'implementazione dovrebbe sembrare sth.in questo modo:

@Component 
public class DataLoader implements ApplicationRunner { 

    private UserRepository userRepository; 

    @Autowired 
    public DataLoader(UserRepository userRepository) { 
     this.userRepository = userRepository; 
    } 

    public void run(ApplicationArguments args) { 
     userRepository.save(new User("lala", "lala", "lala")); 
    } 
} 
+0

public void run(); il metodo deve essere pubblico – eosimosu

1

si può semplicemente creare un file import.sql in src/main/resources e Hibernate eseguirlo quando si crea lo schema.

9

Come suggerimento provare questo:

@Bean 
public CommandLineRunner loadData(CustomerRepository repository) { 
    return (args) -> { 
     // save a couple of customers 
     repository.save(new Customer("Jack", "Bauer")); 
     repository.save(new Customer("Chloe", "O'Brian")); 
     repository.save(new Customer("Kim", "Bauer")); 
     repository.save(new Customer("David", "Palmer")); 
     repository.save(new Customer("Michelle", "Dessler")); 

     // fetch all customers 
     log.info("Customers found with findAll():"); 
     log.info("-------------------------------"); 
     for (Customer customer : repository.findAll()) { 
      log.info(customer.toString()); 
     } 
     log.info(""); 

     // fetch an individual customer by ID 
     Customer customer = repository.findOne(1L); 
     log.info("Customer found with findOne(1L):"); 
     log.info("--------------------------------"); 
     log.info(customer.toString()); 
     log.info(""); 

     // fetch customers by last name 
     log.info("Customer found with findByLastNameStartsWithIgnoreCase('Bauer'):"); 
     log.info("--------------------------------------------"); 
     for (Customer bauer : repository 
       .findByLastNameStartsWithIgnoreCase("Bauer")) { 
      log.info(bauer.toString()); 
     } 
     log.info(""); 
    } 
} 

Opzione 2: Inizializza con schema e dati degli script

Prerequisiti: in application.properties bisogna parlare di questo:

spring.jpa.hibernate.ddl-auto=none (altrimenti script verrà ignorato da Hibernate e analizzerà il progetto per @Entity e/o @Table classi annotate)

Poi, nella tua classe MyApplication incolla questo:

@Bean(name = "dataSource") 
public DriverManagerDataSource dataSource() { 
    DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
    dataSource.setDriverClassName("org.h2.Driver"); 
    dataSource.setUrl("jdbc:h2:~/myDB;MV_STORE=false"); 
    dataSource.setUsername("sa"); 
    dataSource.setPassword(""); 

    // schema init 
    Resource initSchema = new ClassPathResource("scripts/schema-h2.sql"); 
    Resource initData = new ClassPathResource("scripts/data-h2.sql"); 
    DatabasePopulator databasePopulator = new ResourceDatabasePopulator(initSchema, initData); 
    DatabasePopulatorUtils.execute(databasePopulator, dataSource); 

    return dataSource; 
} 

Dove cartella scripts si trova sotto resources cartella (IntelliJ Idea)

Speranza che aiuta qualcuno

2

È possibile utilizzare qualcosa di simile:

@SpringBootApplication 
public class Application { 

@Autowired 
private UserRepository userRepository; 

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

@Bean 
InitializingBean sendDatabase() { 
    return() -> { 
     userRepository.save(new User("John")); 
     userRepository.save(new User("Rambo")); 
     }; 
    } 
} 
Problemi correlati