Configurazione della strategia di denominazione di Hibernate 5

1. Panoramica

Hibernate 5 fornisce due diverse strategie di denominazione da utilizzare con le entità di Hibernate: una strategia di denominazione implicita e una strategia di denominazione fisica.

In questo tutorial, vedremo come configurare queste strategie di denominazione per mappare le entità a nomi di tabelle e colonne personalizzati.

Per i lettori che non conoscono Hibernate, assicurati di controllare il nostro articolo introduttivo qui.

2. Dipendenze

Useremo la dipendenza base di Hibernate Core per questo tutorial:

 org.hibernate hibernate-core 5.3.6.Final 

3. Strategia di denominazione implicita

Hibernate utilizza un nome logico per mappare un nome di entità o attributo a un nome di tabella o colonna. Questo nome può essere personalizzato in due modi : può essere derivato automaticamente utilizzando un ImplicitNamingStrategy oppure può essere definito in modo esplicito utilizzando le annotazioni .

L'ImplicitNamingStrategy governa come Hibernate deriva un nome logico da parte dei nostri nomi di classi e proprietà Java. Possiamo scegliere tra quattro strategie integrate oppure possiamo creare la nostra.

Per questo esempio, utilizzeremo la strategia predefinita, ImplicitNamingStrategyJpaCompliantImpl. Utilizzando questa strategia, i nomi logici saranno gli stessi della nostra classe Java e dei nomi delle proprietà.

Se vogliamo deviare da questa strategia per un'entità specifica, possiamo utilizzare le annotazioni per effettuare tali personalizzazioni . Possiamo usare l' annotazione @Table per personalizzare il nome di una @Entity . Per una proprietà, possiamo usare l' annotazione @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 }

Utilizzando questa configurazione, i nomi logici per l' entità Cliente e le sue proprietà sarebbero:

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

4. Strategia di denominazione fisica

Ora che abbiamo configurato i nostri nomi logici, diamo un'occhiata ai nostri nomi fisici.

Hibernate utilizza la strategia di denominazione fisica per mappare i nostri nomi logici a una tabella SQL e alle sue colonne.

Per impostazione predefinita, il nome fisico sarà lo stesso del nome logico che abbiamo specificato nella sezione precedente . Se vogliamo personalizzare i nomi fisici, possiamo creare una classe PhysicalNamingStrategy personalizzata .

Ad esempio, potremmo voler utilizzare nomi di case camel nel nostro codice Java, ma vogliamo usare nomi separati da trattini bassi per i nostri nomi di tabella e colonna effettivi nel database.

Ora, potremmo usare una combinazione di annotazioni e un ImplicitNamingStrategy personalizzato per mappare correttamente questi nomi, ma Hibernate 5 fornisce PhysicalNamingStrategy come un modo per semplificare questo processo. Prende i nostri nomi logici dalla sezione precedente e ci consente di personalizzarli tutti in un unico posto.

Vediamo come si fa.

Per prima cosa, creeremo una strategia che converte i nostri nomi di casi di cammello per utilizzare il nostro formato SQL più 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); } }

Infine, possiamo dire a Hibernate di utilizzare la nostra nuova strategia:

hibernate.physical_naming_strategy=com.baeldung.hibernate.namingstrategy.CustomPhysicalNamingStrategy

Utilizzando la nostra nuova strategia contro l' entità Cliente , i nomi fisici sarebbero:

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

5. conclusione

In questo rapido articolo, abbiamo imparato la relazione tra le strategie di denominazione fisica e implicita.

Abbiamo anche visto come personalizzare i nomi impliciti e fisici di un'entità e le sue proprietà.

Puoi visualizzare il codice sorgente di questo tutorial su Github.