web-dev-qa-db-fra.com

Insert JPA de démarrage à ressort dans TABLE avec nom majuscule avec Hibernate

j'ai une entité de table mappée comme:

@Entity
public class ItemsToRegister implements Serializable{

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

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

J'ai dans mon fichier application.properties:

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

En veille prolongée 5, ce serait

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

dans votre fichier application.properties.

87
jasonleakey

La solution c'est ajouter:

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

à l'application.properties :)

Ouais!!!

10
carlj

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

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

cela indique à Hibernate de générer le code SQL exactement comme spécifié dans la @Table (name = "") ou la @Column (name = ""). Tout va bien.

Mais gardez à l'esprit que lors de l'utilisation de PhysicalNamingStrategy sans @Table, les annotations @Column dans la classe entity, hibernate génère du SQL en utilisant le nom de la classe et les noms de variables. Considérez ce qui suit Java class

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

alors le sql généré serait,

select employee0_.firstName,employee0_lastName from Employee employee0_;

Malheureusement, ce n'est pas un choix judicieux, car nous aurions généralement défini les colonnes de la base de données comme étant FIRST_NAME et LAST_NAME et le nom de la table comme EMPLOYEE. Si vous n’aviez pas utilisé PhysicalNamingStrategy, le code SQL aurait été

select employee0_.first_name,employee0_last_name from employee employee0_;

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

  • Utilisez PhysicalStrategy et définissez explicitement tous les noms de tables/noms de colonnes dans Java avec des annotations @Table et @Column.
    ou
  • Définissez le nom de table en minuscule dans la base de données et laissez hibernate générer automatiquement les noms de table/noms de colonne.
7
SekharKari

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

@Table(name = "`ITEMS_TO_REGISTER`")
6
John Thompson

Vous pouvez implémenter votre propre stratégie et l'invoquer à partir de application.properties:

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

Ci-dessous un exemple qui met toujours la première lettre en majuscule

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
mjassani

Tu peux essayer:

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