Configuration de la stratégie de nommage Hibernate 5

Configuration de la stratégie de nommage d'Hibernate 5

1. Vue d'ensemble

Hibernate 5 fournit deux stratégies de dénomination différentes à utiliser avec les entités Hibernate: une stratégie de dénomination implicite et une stratégie de dénomination physique.

Dans ce didacticiel, nous allons voir comment configurer ces stratégies de dénomination pour mapper des entités à des noms de table et de colonne personnalisés.

Pour les lecteurs qui découvrent Hibernate, assurez-vous de consulter nosintroduction article here.

2. Les dépendances

Nous utiliserons lesbasic Hibernate Core dependency pour ce didacticiel:


    org.hibernate
    hibernate-core
    5.3.6.Final

3. Stratégie de dénomination implicite

Hibernate utilise un nom logique pour mapper une entité ou un nom d'attribut sur un nom de table ou de colonne. Ce nomcan be customized in two ways: il peut être dérivé automatiquement en utilisant unImplicitNamingStrategy ou il peut être défini explicitement en utilisant les annotations.

LeImplicitNamingStrategy régit la manière dont Hibernate dérive un nom logique à partir de nos noms de classe et de propriété Java. We can select from four built-in strategies, or we can create our own.

Pour cet exemple, nous utiliserons la stratégie par défaut,ImplicitNamingStrategyJpaCompliantImpl.. En utilisant cette stratégie, les noms logiques seront les mêmes que nos noms de classe et de propriété Java.

If we want to deviate from this strategy for a specific entity, we can use annotations to make those customizations. Nous pouvons utiliser l'annotation@Table pour personnaliser le nom d'un@Entity. Pour une propriété, nous pouvons utiliser l'annotation@Column:

@Entity
@Table(name = "Customers")
public class Customer {

    @Id
    @GeneratedValue
    private Long id;

    private String firstName;

    private String lastName;

    @Column(name = "email")
    private String emailAddress;

    // getters and setters

}

En utilisant cette configuration, les noms logiques de l'entitéCustomer et de ses propriétés seraient:

Customer -> Customers
firstName -> firstName
lastName -> lastName
emailAddress -> email

4. Stratégie de dénomination physique

Maintenant que nous avons configuré nos noms logiques, examinons nos noms physiques.

Hibernate utilise la stratégie de nommage physique pour mapper nos noms logiques sur une table SQL et ses colonnes.

By default, the physical name will be the same as the logical name que nous avons spécifié dans la section précédente. Si nous voulons personnaliser les noms physiques, nous pouvons créer une classePhysicalNamingStrategy personnalisée.

Par exemple, nous souhaitons peut-être utiliser des noms de casse de chameau dans notre code Java, mais des noms séparés par un tiret bas pour nos noms réels de table et de colonne dans la base de données.

Maintenant, nous pourrions utiliser une combinaison d'annotations et unImplicitNamingStrategy personnalisé pour mapper correctement ces noms, mais Hibernate 5 fournit lesPhysicalNamingStrategy comme un moyen de simplifier ce processus. Il reprend nos noms logiques de la section précédente et nous permet de les personnaliser tous en un seul endroit.

Voyons comment cela se fait.

Tout d'abord, nous allons créer une stratégie qui convertit nos noms de cas de chameau pour utiliser notre format SQL plus standard:

public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy {

    @Override
    public Identifier toPhysicalCatalogName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }

    @Override
    public Identifier toPhysicalColumnName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }

    @Override
    public Identifier toPhysicalSchemaName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }

    @Override
    public Identifier toPhysicalSequenceName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }

    @Override
    public Identifier toPhysicalTableName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }

    private Identifier convertToSnakeCase(final Identifier identifier) {
        final String regex = "([a-z])([A-Z])";
        final String replacement = "$1_$2";
        final String newName = identifier.getText()
          .replaceAll(regex, replacement)
          .toLowerCase();
        return Identifier.toIdentifier(newName);
    }
}

Enfin, nous pouvons dire à Hibernate d’utiliser notre nouvelle stratégie:

hibernate.physical_naming_strategy=com.example.hibernate.namingstrategy.CustomPhysicalNamingStrategy

En utilisant notre nouvelle stratégie contre l'entitéCustomer, les noms physiques seraient:

Customer -> customers
firstName -> first_name
lastName -> last_name
emailAddress -> email

5. Conclusion

Dans cet article rapide, nous avons appris la relation entre les stratégies de dénomination implicite et physique.

Nous avons également vu comment personnaliser les noms implicites et physiques d’une entité et ses propriétés.

Vous pouvez afficher le code source de ce tutorielover on Github.