2015-02-17 7 views
16

ho un'entità tavolo mappata come:Primavera avvio APP inserto in tabella con nome maiuscolo con Hibernate

@Entity 
public class ItemsToRegister implements Serializable{ 

@Id 
@Column(name = "ID_ITEM_TO_REGISTER") 
@GeneratedValue(strategy = GenerationType.AUTO) 
private int id; 
..... 

Quando provo ad inserire nuovo record nel database, il nome della tabella è stato tradotto in minuscolo come: items_to_register, ma il nome della mia tabella è ITEMS_TO_REGISTER Come posso risolvere il mio problema senza modificare la configurazione di MySql? (My.cnf)

ho nel mio file application.properties:

spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy 

risposta

43

Su hibernate 5, sarebbe

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

nei tuoi application.properties file.

+0

Grazie! Ho risolto lo stesso problema per me :) – avivklas

+0

Grazie! – Adnan

+0

Grazie! Questo mi ha aiutato molto! –

2

si può provare:

@Entity 
@Table(name = "ITEMS_TO_REGISTER") 
public class ItemsToRegister implements Serializable { 
    ... 
+0

Questo è esattamente ciò che ha funzionato per me. – pgonzaleznetwork

4

avrete bisogno di sfuggire il nome della tabella con tic (`) per renderlo case sensitive

@Table(name = "`ITEMS_TO_REGISTER`") 
+0

I tics non funzionavano, ma sfuggiva a una doppia citazione. vale a dire. '@Table (name =" \ "ITEMS_TO_REGISTER \" ")'. Sono su postgres e uso eclipselink. Forse questo fa la differenza. –

+0

Sì, questo è il modo corretto di farlo: con le virgolette regolari (") come indicato da Josh C. Se l'ibernazione vede quelle, cita l'identificatore dato appropriatamente per il dialetto, ad esempio con backtick (') per MySQL. –

+0

Lo so, sembra un codice da cowboy, ma funziona –

9

La soluzione è aggiungere:

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

alle application.properties :)

Yeah !!!

+0

Come ha funzionato per te !! –

+0

Salvatore del giorno Grazie –

3

Come suggerito da @jasonleakey, possiamo considerare l'uso della strategia di denominazione come di seguito.

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

questo dice Hibernate per generare di SQL come esattamente come specificato nel @Table (name = " ") o @Column (name =""). Tutto bene.

Ma tenere a mente - durante l'utilizzo di PhysicalNamingStrategy senza @Table, annotazioni @Column nella classe entity, hibernate genera SQL utilizzando nomi di classi e nomi di variabili. Si consideri la classe Java sotto

Class Employee { 
    private String firstName; 
    private String lastName; 
} 

poi il codice SQL generato sarebbe,

select employee0_.firstName,employee0_lastName from Employee employee0_; 

Purtroppo questa non è una grande scelta come tipicamente avremmo definito le colonne nel DB come FIRST_NAME e COGNOME e nome della tabella come DIPENDENTE. non aveva usato PhysicalNamingStrategy SQL sarebbe stato

select employee0_.first_name,employee0_last_name from employee employee0_; 

quindi è davvero una scelta tra il sotto due opzioni.

  • Utilizzare PhysicalStrategy e definire esplicitamente tutti i nomi di tabelle/nomi di colonne nel codice java con le annotazioni @Table e @Column.
    o
  • Definisci il nome della tabella in minuscolo in db e lascia che hibernate generi automaticamente nomi di nomi di tabelle/colonne per noi.
1

è possibile implementare la propria strategia e richiama da application.properties:

spring.jpa.hibernate.naming.physical-strategy=com.proto.CustomPhysicalNamingStrategy 

Bellow un esempio che capitalizzare sempre la prima lettera

import java.io.Serializable; 
import org.apache.commons.lang3.StringUtils; 
import org.hibernate.boot.model.naming.Identifier; 
import org.hibernate.boot.model.naming.PhysicalNamingStrategy; 
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; 

public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy, Serializable { 
    /** 
    * Singleton access 
    */ 
    public static final CustomPhysicalNamingStrategy INSTANCE = new CustomPhysicalNamingStrategy(); 

    @Override 
    public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) { 
     return capitalize(name); 
    } 

    @Override 
    public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) { 
     return capitalize(name); 
    } 

    @Override 
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { 
     return capitalize(name); 
    } 

    @Override 
    public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) { 
     return capitalize(name); 
    } 

    @Override 
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { 
     return capitalize(name); 
    } 

    private Identifier capitalize(Identifier name) { 
     if (name == null) 
      return null; 
     if (name.isQuoted()) 
      return name; 
     String text = StringUtils.capitalize(name.getText()); 
     return Identifier.toIdentifier(text); 
    } 
} 
Problemi correlati