web-dev-qa-db-fra.com

Stratégie de nommage Hibernate, modification des noms de table

Je suis un peu confus par la stratégie de dénomination hibernates (version 5.1) - à savoir qu'elle change le nom de ma table et j'aimerais éviter cela. Aussi - spring.jpa.hibernate.naming_strategy Semble être obsolète selon intelij, mais je ne trouve pas de (autre) façon de le configurer correctement.

J'ai la configuration suivante dans application.properties:

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
spring.jpa.properties.hibernate.current_session_context_class=thread

Le premier est marqué comme déprécié, comme dit.

Maintenant, j'ai une entité:

@Entity
@Table(name = "usaUploadTable", schema = "usertable201", catalog = "")
public class UsaUploadTable {
    ....
}

Le nom de la table est, comme dans @Table(name = "") usaUploadTable.

Maintenant, quand je lance mon application, je reçois

La table 'usertable201.usa_upload_table' n'existe pas

ce qui est correct - il n'est pas nommé comme la façon dont hibernate le change.

Que puis-je faire pour que la mise en veille prolongée utilise correctement le nom de ma table?

Éditer:

J'ai aussi essayé

DefaultNamingStrategy
ImprovedNamingStrategy

Tous le changent

Versions:

spring-boot-1.4.0.RELEASE
hibernate 5.1
javax-transaction-api 1.2
hibernate-validator 5.2.4
javassist 3.20
10
J.Doe

Le problème réside dans spring-boot-1.4 - il semble qu'ils aient changé les propriétés (ou quoi que ce soit) J'ai maintenant trouvé cette réponse ImprovedNamingStrategy ne fonctionne plus dans Hibernate 5 , mais ce n'est toujours pas le cas résoudre correctement. J'ai donc un peu changé le code pour ne pas utiliser la méthode de soulignement et pour étendre la classe nouvellement introduite SpringPhysicalNamingStrategy:

package com.foo;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

import Java.io.Serializable;
import Java.util.Locale;


public class RealNamingStrategyImpl extends org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy implements Serializable {

    public static final PhysicalNamingStrategyImpl INSTANCE = new PhysicalNamingStrategyImpl();

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText(), name.isQuoted());
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText(), name.isQuoted());
    }

}

Et en application.properties J'ai changé la ligne obsolète en

spring.jpa.properties.hibernate.physical_naming_strategy=<package>.RealNamingStrategyImpl

Maintenant, il utilise exactement les noms de table et de colonne tels que je les ai dans mes fichiers d'entité.

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

ça a marché pour moi. voici les versions que j'utilise:

Spring Boot (v1.4.2.RELEASE)
Hibernate Core {5.0.11.Final}
9
rsinha

Pour ceux qui veulent majuscules dans Postgresql et Spring boot 1.5.2

public class CustomDatabaseIdentifierNamingStrategy extends org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy implements Serializable {

    public static final long serialVersionUID = 1L;
    public static final CustomDatabaseIdentifierNamingStrategy INSTANCE = new CustomDatabaseIdentifierNamingStrategy();

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText().toUpperCase(), true);
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText().toUpperCase(), true);
    }

}
1
Bằng Rikimaru

Si vous fournissez des annotations @Table et @Column dans vos classes d'entité avec des noms fournis avec un trait de soulignement, c'est-à-dire user_id, c'est-à-dire @Column (name = "ser_id"), il prendra le nom de la colonne comme user_id; si vous le donnez comme ID utilisateur, il changera en ID utilisateur si vous n'utilisez aucune stratégie ou stratégie implicite (en particulier spring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl). Donc, si vous voulez une stratégie où le nom d'attribut d'entité change en un avec un soulignement et des lettres minuscules, c'est-à-dire quelque chose de userId à user_id, vous devez utiliser une stratégie implicite ou aucune (qui utilise en fait une stratégie implicite).

Si vous ne voulez pas que votre stratégie de nommage ajoute un trait de soulignement au nom de la colonne ou au nom de classe, alors la stratégie que vous devez utiliser devrait ressembler à: spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot .model.naming.PhysicalNamingStrategyStandardImpl. Les éléments que vous fournissez dans les annotations @Table et l'attribut de nom @ Column resteront tels quels.

Si vous ne souhaitez pas fournir d'annotations et gérer manuellement le nom de la table et les noms des colonnes, vous devez étendre la classe org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl et remplacer les méthodes requises. Si vous utilisez toujours des annotations pour certains cas ici, n'oubliez pas que les méthodes remplacées s'appliqueront aux noms écrits dans ces annotations. spring.jpa.hibernate.naming.physical-strategy = exemple.CustomStrategy

0
Raj Kundalia