14
votes

I have a table in 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,
  )

and I am trying Map on this Table So I used @Table JPA annotation (see below). This is my 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

and finaly this is my entity class:

@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;

If I have it like this @Table(name="UTILISATEUR") I get msg from PostgreSQL

ERREUR: la relation « utilisateur » n'existe pas 

When I try to escape quote @Table(name="\"UTILISATEUR\"")

ERROR: syntax error at or near "`"

I tried the responses from this question but it doesn't work

Spring boot JPA insert in TABLE with uppercase name with Hibernate

update

I've been searching about ImprovedNamingstrategy it's seems like an issue in spring boot instead I've used EJB3NamingStrategy and also DefaultNamingStrategy it's not working what funny it's when Hibernate execute the SQL the result is pretty confusing :

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_ 

It's like it knows the table name is in UPPERCASE but does not want to map or I don't know what wrong with it this is the result of using

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

and also the EJB3NamingStrategy

This is also the result when I use the annotation like that

@Table(name="UTILISATEUR")  

and I also tried like that

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

and I get the issue

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_ 

finally this is my 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>
4
The best approach is to never use quoted identifiers - they are much more trouble then they are worth it. - a_horse_with_no_name
I know that But I can't touch database structure :/ it's those project where they have the database and you are going to use it - Kamel Mili
In the JPA implementation I use (DataNucleus) I can simply set a persistence property to "lowercase" or "UPPERCASE" and it does the necessary changes to what is specified, and all works. Maybe your chosen implementation has something like that? - Neil Stockton
In my opinion what you can do is implement a custom naming strategy to convert entity names to their corresponding table names. - Bunti
If you are using postgres, then why are you working with a Mysql Dialect?! - M. Deinum

4 Answers

11
votes

maybe because you are using MYSQL5DIALECT there's a Postgres Dialect just used post it like this and for the improved naming strategy use EJB3 like Spring boot JPA insert in TABLE with uppercase name with Hibernate

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

hope it works for you

9
votes

I reproduced your UTILISATEUR table (role removed) in postgres 8.4 and hibernate 5.0.3.

It works as expected with explicit table and column names annotation:

@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

}
2
votes

You can configure your application with the next line depend the database:

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
-2
votes

I faced the same issue and I back quoted ( ` ) my table name in the entity declaration like this "`UTILISATEUR`". @Table(name = "`UTILISATEUR`")

` using postgresql 11 with dialect : org.hibernate.dialect.PostgreSQL95Dialect it generated me an upercased table name on database.