Botte de printemps JPA insérer dans la TABLE avec le nom en majuscule avec L'hibernation

j'ai une table entités mappées comme :

@Entity
public class ItemsToRegister implements Serializable{

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

quand j'essaie d'insérer un nouvel enregistrement dans la base de données, le nom de la table a été traduit en minuscules comme: items_to_register, mais mon nom de table est ITEMS_TO_REGISTER Comment puis-je résoudre mon problème sans changer la configuration MySql? (mon.cnf)

j'ai dans ma demande.fichier de propriétés :

spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy
25
demandé sur Neil Stockton 2015-02-18 00:54:44

6 réponses

Sur hibernate 5, il serait

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

dans votre application.propriétés fichier.

64
répondu jasonleakey 2016-08-28 17:50:35

La solution c'est d'ajouter :

printemps.jpa.hiberner.naming_strategy=org.hiberner.cfg.EJB3NamingStrategy

à la demande.propriétés :)

Ouais!!!

9
répondu carlj 2015-02-24 21:02:38

vous aurez besoin d'échapper au nom de la table avec tics(`) pour le rendre sensible à la casse.

@Table(name = "`ITEMS_TO_REGISTER`")
5
répondu John Thompson 2015-02-18 01:30:09

comme @jasonleakey l'a suggéré, nous pouvons envisager d'utiliser la stratégie de nommage comme ci-dessous.

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

Ceci indique à Hibernate de générer des SQL exactement comme spécifié dans la table @(name=" ") ou la colonne @(name=" "). Tous bien.

mais gardez à l'esprit - tout en utilisant PhysicalNamingStrategy sans @Table, @Column annotations dans la classe entity, hibernate génère SQL en utilisant le nom de classe et les noms de variables. Considérez la classe java ci-dessous

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

ensuite générés sql serait,

select employee0_.firstName,employee0_lastName from Employee employee0_;

malheureusement ce n'est pas un grand choix car typiquement nous aurions défini les colonnes dans DB comme FIRST_NAME et LAST_NAME et table name comme EMPLOYEE. Si vous n'aviez pas utilisé PhysicalNamingStrategy le SQL aurait été

select employee0_.first_name,employee0_last_name from employee employee0_;

donc c'est vraiment un choix entre les deux options ci-dessous.

  • utilisez PhysicalStrategy et définissez explicitement tous les noms de tables / colonnes dans le code java avec @Table et @Column annotation.

    ou
  • définir le nom de la table en minuscules dans la base de données et laisser hibernate générer automatiquement des noms de table / colonne pour nous.
4
répondu SekharKari 2017-05-26 19:17:28

Vous pouvez essayer:

@Entity
@Table(name = "ITEMS_TO_REGISTER")
public class ItemsToRegister implements Serializable {
   ...
2
répondu Mikk 2015-02-17 22:12:04

vous pouvez mettre en œuvre votre propre stratégie et l'invoquer à partir de l'application.propriétés:

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

voici un exemple qui capitalise toujours la première lettre

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);
    }
}
2
répondu mjassani 2017-08-01 15:28:29