IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Boot Java Discussion :

Spring Boot + Hibernate + PostgreSQL : Relation "maTable" does not exist


Sujet :

Spring Boot Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut Spring Boot + Hibernate + PostgreSQL : Relation "maTable" does not exist
    Bonjour,

    Je suis débutant avec Spring Boot. J'ai suivi le tutoriel suivant à la (quasi) lettre : http://sqli.developpez.com/tutoriels...nd-springboot/

    Avec néanmoins les différences suivantes :
    - Ma base de données est déjà créée
    - J'utilise un fichier application.properties au lieu de application.yml
    - spring.jpa.hibernate.ddl-auto = validate

    Je souhaite juste récupérer tous les utilisateurs via un service getAllUtilisateur() dans un @RestController.

    Code application.properties : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    # Datasource settings
    spring.datasource.url = jdbc:postgresql://131.137.126.118:5437/DIPP
    spring.datasource.username = postgres
    spring.datasource.password = postgres
    spring.datasource.driver-class-name = org.postgresql.Driver
     
    # Keep the connection alive if idle for a long time (needed in production)
    spring.datasource.testWhileIdle = true
    spring.datasource.validationQuery = SELECT 1
     
    # Show or not log for each sql query
    spring.jpa.show-sql = true
     
    # Hibernate ddl auto (create, create-drop, update)
    spring.jpa.hibernate.ddl-auto = validate
     
    # Naming strategy
    spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.EJB3NamingStrategy
     
    #spring.jpa.hibernate.defaut-schema = DIPP
     
    # Use spring.jpa.properties.* for Hibernate native properties (the prefix is
    # stripped before adding them to the entity manager)
     
    # The SQL dialect makes Hibernate generate better SQL for the chosen database
    spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect

    Code Utilisateur.java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    @Entity
    @Table(name = "utilisateurs")
    public class Utilisateur {
    	@Id
    	@GeneratedValue(strategy = GenerationType.AUTO)
    	private Integer id;
     
    	private String code;
     
    	private String prenom;
     
    	private String nom;
     
    	private String email;
     
    	private String langue;
     
    	public Integer getId() {
    		return id;
    	}
     
    	public void setId(Integer id) {
    		this.id = id;
    	}
     
    	public String getCode() {
    		return code;
    	}
     
    	public void setCode(String code) {
    		this.code = code;
    	}
     
    	public String getPrenom() {
    		return prenom;
    	}
     
    	public void setPrenom(String prenom) {
    		this.prenom = prenom;
    	}
     
    	public String getNom() {
    		return nom;
    	}
     
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
    	public String getEmail() {
    		return email;
    	}
     
    	public void setEmail(String email) {
    		this.email = email;
    	}
     
    	public String getLangue() {
    		return langue;
    	}
     
    	public void setLangue(String langue) {
    		this.langue = langue;
    	}
    }

    Code MainApplication.java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package com.elis;
     
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
     
    @Configuration
    @EnableAutoConfiguration
    @ComponentScan
    public class MainApplication {
    	public static void main(String[] args) throws Exception {
    		SpringApplication.run(MainApplication.class, args);
    	}
    }

    Code pom.xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<groupId>com.elis</groupId>
    	<artifactId>dipp</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
     
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>1.3.5.RELEASE</version>
    	</parent>
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-data-jpa</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.postgresql</groupId>
    			<artifactId>postgresql</artifactId>
    			<version>9.4.1208.jre7</version>
    		</dependency>
    	</dependencies>
     
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.apache.maven.plugins</groupId>
    				<artifactId>maven-compiler-plugin</artifactId>
    				<configuration>
    					<source>1.8</source>
    					<target>1.8</target>
    				</configuration>
    			</plugin>
    		</plugins>
    	</build>
    </project>

    Lorsque je démarre mon application, il n'y a aucune erreur. Mon entité est bien validée. Si je m'amuse à rajouter à mon entité des attributs qui n'existent pas en base, hibernate va me crier dessus.

    Maintenant, lorsque j'appelle mon service http://localhost:8080/users, j'ai une erreur qui apparaît dans la console d'Eclipse :
    org.postgresql.util.PSQLException: ERREUR: la relation « utilisateurs » n'existe pas

    Voici la requête générée par Hibernate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Hibernate: select utilisateu0_.id as id1_0_, utilisateu0_.code as code2_0_, utilisateu0_.email as email3_0_, utilisateu0_.langue as langue4_0_, utilisateu0_.nom as nom5_0_, utilisateu0_.prenom as prenom6_0_ from utilisateurs utilisateu0_
    (note : j'ai fait attention au nommage, pas de guillemet lors de la création des tables)

    Lorsque je la copie/colle dans SQL Developer, elle passe !

    Donc que se passe-t-il avec mon application ? Pourquoi ne trouve-t-il pas la table ?

    Merci d'avance pour votre aide.

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Soit tu n'as pas la table utilisateurs dans la base DIPP.
    Soit tu as créés la table avec une sensibilité à la casse (`Utilisateurs`) avec des quotes, donc il n'arrive pas à le trouver. Dans ce cas remet les noms de table tout en minuscule pour éviter ce problème si c'est possible.

    A+.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut
    Comme indiqué dans mon message initial, j'ai fait attention au nommage des tables pour éviter les problèmes de casse.
    Et quand j'exécute la requête SQL générée par Hibernate en base de données telle quelle, ça fonctionne.

    Le problème doit être ailleurs.

  4. #4
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    salut,
    dans Postgré,
    les noms de tables doivent commencer par une minuscule.
    recrees tes Tables avec les noms commencant par une minuscule.
    Et vois si c´est reglé.
    sinon jette un coup d´oeil ici:
    lien


    Eric

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut
    Même réponse qu'à andry.aime. J'ai fait attention lors de la création des tables, elles sont toutes en minuscule. Ainsi que le nom de schéma. Je n'ai pas utilisé de guillemet.

    Après avoir exécuté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET search_path TO dipp;
    Je peux faire select * from utilisateurs en base de données. Et ça me retourne des résultats sans problème.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut
    J'ai trouvé la solution.

    En mettant au niveau de l'entité l'attribut "schema"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @Entity
    @Table(name = "utilisateurs", schema = "dipp")
    public class Utilisateur {
    J'avais enfin des résultats.

    J'ai ensuite essayé plusieurs propriétés dans mon fichier application.properties pour mettre le schéma par défaut, mais rien n'y fait...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # aucune instruction ne fonctionne
    spring.jpa.hibernate.default-schema = dipp
    spring.jpa.hibernate.default_schema = dipp
    spring.datasource.schema = dipp
    Enfin je suis tombé sur ce code, j'ai exécuté la requête SQL donnée. Et voilà.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER USER postgres SET search_path to dipp;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/07/2007, 10h39
  2. Réponses: 4
    Dernier message: 24/04/2007, 18h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo