web-dev-qa-db-fra.com

Noms de table JPA en majuscules

J'ai une table en Postgresql:

CREATE TABLE "UTILISATEUR"(

 "IdUtilisateur" serial NOT NULL,
 "Nom" character varying(50),
 "Prenom" character varying(50),
 "Profil" character varying(50),
 "Pseudo" character varying(20),
 "IdSite" integer DEFAULT 0,
 "Password" character varying(1024),
  id_role integer,
  )

et j'essaie de mapper sur ce tableau. J'ai donc utilisé l'annotation JPA @Table (voir ci-dessous). Voici mon application.propreties:

spring.datasource.url = jdbc:postgresql://localhost/baseecu
spring.datasource.username = postgres
spring.datasource.password =root
spring.datasource.driverClassName=org.postgresql.Driver
spring.jpa.database = MYSQL 
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto=update 
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

et enfin c'est ma classe d'entité:

@Entity
@Table(name="UTILISATEUR")
public class Utilisateur   {
@Id
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name="IdUtilisateur")
public Long id ;
public String Nom ; 
public String Prenom ; 
public String Profil ; 
public String Pseudo ; 


public String Password ;
@ManyToOne
@JoinColumn(name="id_role")
public Role role ;
public Long getId() {
    return id;

Si je l'ai comme ça @Table(name="UTILISATEUR") je reçois un msg de PostgreSQL

ERREUR: la relation « utilisateur » n'existe pas 

Quand j'essaie d'échapper à la citation @Table(name="\"UTILISATEUR\"")

ERROR: syntax error at or near "`"

J'ai essayé les réponses de cette question mais cela ne fonctionne pas

Insertion Spring Boot JPA dans TABLE avec nom en majuscule avec Hibernate

mise à jour

J'ai cherché sur ImprovedNamingstrategy, cela semble être un problème dans le démarrage de printemps à la place.J'ai utilisé EJB3NamingStrategy et DefaultNamingStrategy, cela ne fonctionne pas ce qui est drôle quand Hibernate exécute le SQL, le résultat est assez déroutant:

Hibernate: select utilisateu0_.IdUtilisateur as IdUtilis1_2_, utilisateu0_.Nom as Nom2_2_, utilisateu0_.Password as Password3_2_, utilisateu0_.Prenom as Prenom4_2_, utilisateu0_.Profil as Profil5_2_, utilisateu0_.Pseudo as Pseudo6_2_, utilisateu0_.id_role as id_role7_2_ from UTILISATEUR utilisateu0_ 

C'est comme s'il savait que le nom de la table est en MAJUSCULE mais ne veut pas mapper ou je ne sais pas quel mal cela est le résultat de l'utilisation

spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.DefaultNamingStrategy
or 
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.DefaultNamingStrategy

et aussi le EJB3NamingStrategy

C'est aussi le résultat quand j'utilise l'annotation comme ça

@Table(name="UTILISATEUR")  

et j'ai aussi essayé comme ça

@Table(name="\"UTILISATEUR\"")

et je reçois le problème

ERROR: syntax error at or near "`"

Hibernate: select utilisateu0_.IdUtilisateur as IdUtilis1_2_, utilisateu0_.Nom as Nom2_2_, utilisateu0_.Password as Password3_2_, utilisateu0_.Prenom as Prenom4_2_, utilisateu0_.Profil as Profil5_2_, utilisateu0_.Pseudo as Pseudo6_2_, utilisateu0_.id_role as id_role7_2_ from `UTILISATEUR` utilisateu0_ 

enfin c'est mon pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.xx.MDValidation</groupId>
<artifactId>xx.MDValidation</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>xx.MDValidation</name>
<description>Projet Validation xx</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.2.RELEASE</version>
</parent>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <Java.version>1.8</Java.version>
<hibernate.version>4.2.21.Final</hibernate.version>
<commons-dbcp.version>1.2.2</commons-dbcp.version>
</properties>

    <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>

    </dependency>


        <dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901.jdbc4</version>
</dependency>
<dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-Java</artifactId>
        <scope>runtime</scope>
    </dependency>


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-Java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jooq</artifactId>
    </dependency>
    <dependency>
        <groupId>bsf</groupId>
        <artifactId>bsf</artifactId>
        <version>2.4.0</version>
    </dependency>
    </dependencies>


<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
10
Kamel Mili

peut-être parce que vous utilisez MYSQL5DIALECT, un dialecte Postgres vient d'être utilisé comme ceci et pour la stratégie de dénomination améliorée, utilisez EJB3 comme Spring boot JPA insert in TABLE with uppercase case with Hibernate

spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect

j'espère que ça marche pour toi

8
amani92

J'ai reproduit votre table UTILISATEUR (rôle supprimé) dans postgres 8.4 et hibernate 5.0.3.

Il fonctionne comme prévu avec l'annotation explicite des noms de table et de colonne:

@Entity(name="\"UTILISATEUR\"")
public class Utilisateur {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="\"IdUtilisateur\"")
    private Long id ;

    @Column(name="\"Nom\"")
    private String Nom ; 
    @Column(name="\"Prenom\"")
    private String Prenom ; 
    @Column(name="\"Profil\"")
    private String Profil ; 
    @Column(name="\"Pseudo\"")
    private String Pseudo ; 

    @Column(name="\"Password\"")
    private String Password ;

    ... getter / setters

}
7
riskop

Vous pouvez configurer votre application avec la ligne suivante en fonction de la base de données:

MySql

spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.DefaultNamingStrategy

Postgres

spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect

Oracle

spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect