Configuration de la stratégie de dénomination Hibernate 5

1. Vue d'ensemble

Hibernate 5 propose 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 verrons 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 notre article d'introduction ici.

2. Dépendances

Nous utiliserons la dépendance de base Hibernate Core pour ce tutoriel:

 org.hibernate hibernate-core 5.3.6.Final 

3. Stratégie de dénomination implicite

Hibernate utilise un nom logique pour mapper un nom d'entité ou d'attribut à un nom de table ou de colonne. Ce nom peut être personnalisé de deux manières : il peut être dérivé automatiquement à l'aide d'un ImplicitNamingStrategy ou il peut être défini explicitement à l'aide d'annotations .

Le ImplicitNamingStrategy régit la façon dont Hibernate tire un nom logique de nos noms de classe Java et propriété. Nous pouvons choisir parmi quatre stratégies intégrées, ou nous pouvons créer la nôtre.

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.

Si nous voulons nous écarter de cette stratégie pour une entité spécifique, nous pouvons utiliser des annotations pour effectuer ces personnalisations . Nous pouvons utiliser l' annotation @Table pour personnaliser le nom d'une @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 }

À l'aide de cette configuration, les noms logiques de l' entité Client 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, jetons un œil à nos noms physiques.

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

Par défaut, le nom physique sera le même que le nom logique que nous avons spécifié dans la section précédente . Si nous voulons personnaliser les noms physiques, nous pouvons créer une classe PhysicalNamingStrategy personnalisée .

Par exemple, nous souhaitons peut-être utiliser des noms de cas camel dans notre code Java, mais nous souhaitons utiliser des noms séparés par des traits de soulignement pour nos noms de table et de colonne réels dans la base de données.

Maintenant, nous pourrions utiliser une combinaison d'annotations et une ImplicitNamingStrategy personnalisée pour mapper correctement ces noms, mais Hibernate 5 fournit la PhysicalNamingStrategy comme moyen de simplifier ce processus. Il reprend nos noms logiques de la section précédente et nous permet de tous les personnaliser au même endroit.

Voyons comment cela se fait.

Tout d'abord, nous allons créer une stratégie qui convertit nos noms de cas de chameaux 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.baeldung.hibernate.namingstrategy.CustomPhysicalNamingStrategy

En utilisant notre nouvelle stratégie contre l' entité Client , 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 didacticiel sur Github.