2017-01-24 1 views
4

J'ai un problème avec le chargement des données dans la base de données en mémoire lors de l'initialisation de l'application. J'ai créé schema.sql et data.sql fichiers contenant la structure de table et les données initiales.Spring Boot dans la base de données de la mémoire H2 ne charge pas les données du fichier à l'initialisation

schema.sql:

CREATE TABLE users (
    id   INT PRIMARY KEY, 
    username VARCHAR(64) NOT NULL, 
    password VARCHAR(64) 
); 

et data.sql:

INSERT INTO users (id, username, password) VALUES 
    (1, 'usr1', 'bigSecret'), 
    (2, 'usr2', 'topSecret'); 

J'utilise JpaRepository pour travailler avec la couche de données:

public interface UserRepository extends JpaRepository<User, Long> { 
} 

Et je aussi con Figure application.properties

spring.datasource.initialize=true 
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=- 1;DB_CLOSE_ON_EXIT=FALSE 
spring.datasource.driverClassName=org.h2.Driver 
spring.datasource.username=sa 
spring.datasource.password= 

Mais quand je l'appelle

List<User> users = userRepository.findAll(); 

entité utilisateur

@Entity 
@Table(name = "users") 
public class User { 

    @Id 
    @GeneratedValue 
    private Long id; 
    private String username; 
    private String password; 

    public User() { } 

    public Long getId() { 
    return id; 
    } 

    public void setId(Long id) { 
    this.id = id; 
    } 

    public String getUsername() { 
    return username; 
    } 

    public void setUsername(String username) { 
    this.username = username; 
    } 

    public String getPassword() { 
    return password; 
    } 

    public void setPassword(String password) { 
    this.password = password; 
    } 
} 

Je reçois la liste vide, mais je devrais obtenir deux utilisateurs préremplis de mon en -mémoire H2 base de données. Quel est le problème avec la base de données de la mémoire? Merci.

+2

où avez-vous placé ces scripts? –

+0

Je me demande si votre URL est OK avec l'espace supplémentaire 'DB_CLOSE_DELAY = - 1;' => 'DB_CLOSE_DELAY = -1;' – alexbt

+0

pouvez-vous montrer votre entité 'User' – Patrick

Répondre

1

Vous pouvez toujours essayer d'exécuter les scripts par spécification de h2, où vous devez ajouter un script INIT dans votre URL de connexion (étant l'une des options):

jdbc:h2:mem:test;INIT=RUNSCRIPT FROM '~/schema.sql'\;RUNSCRIPT FROM '~/data.sql'" 

Cette fonctionnalité est activée par la propriété INIT. Notez que plusieurs commandes peuvent être transmises à INIT, mais le délimiteur de point-virgule doit être échappé, comme dans l'exemple ci-dessous.

Mise à jour

Soyez conscient que d'avoir ces options dans votre application.properties:

spring.jpa.generate-ddl=true 
spring.jpa.hibernate.ddl-auto=true 
spring.datasource.initialize 

peut causer des cliquetis lors du démarrage. Donc, vous devriez toujours viser l'un ou l'autre, mais jamais les deux en même temps.

+0

J'ai essayé d'ajouter des scripts sql (schema.sql et data.sql) à ** INIT ** dans 'spring.datasource.url' propriété à application.conf, mais j'ai obtenu une exception au lancement de l'application - dire que la table est déjà créée (_org.h2.jdbc.JdbcSQLException: La table "USERS" existe déjà, SQL statement_), et je pense que c'est à cause de 'spring. datasource.initialize = true'. Donc ... il semble que ** INIT ** et 'spring.datasource.initialize = true' ne fonctionneront pas [email protected] Kowalski – tyomka

+0

Vrai, j'ai mis à jour mon message. –

+0

Les paramètres corrects pour ** application.conf ** pour le faire fonctionner dans une base de données de mémoire initialisée avec des données sont: 'spring.datasource.initialize = true'' spring.datasource.url = jdbc: h2: mem: testdb; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE' 'spring.datasource.driverClassName = org.h2.Driver'' spring.datasource.username = sa' 'spring.datasource.password =' et le plus important, n'oubliez pas de désactiver Hibernate propriété d'initialisation de base de données 'spring.jpa.hibernate.ddl-auto = none' car la valeur par défaut' create-drop' supprimera toutes les données des tables insérées avant. Et vous aurez des tables vides. – tyomka