Konfiguration der Namensstrategie für den Ruhezustand 5

1. Übersicht

Hibernate 5 bietet zwei verschiedene Benennungsstrategien für die Verwendung mit Hibernate-Entitäten: eine implizite Benennungsstrategie und eine physische Benennungsstrategie.

In diesem Lernprogramm erfahren Sie, wie Sie diese Benennungsstrategien so konfigurieren, dass Entitäten benutzerdefinierten Tabellen- und Spaltennamen zugeordnet werden.

Für Leser, die Hibernate noch nicht kennen, lesen Sie bitte unseren Einführungsartikel hier.

2. Abhängigkeiten

Für dieses Tutorial verwenden wir die grundlegende Hibernate Core-Abhängigkeit:

 org.hibernate hibernate-core 5.3.6.Final 

3. Implizite Namensstrategie

Der Ruhezustand verwendet einen logischen Namen, um einen Entitäts- oder Attributnamen einem Tabellen- oder Spaltennamen zuzuordnen. Dieser Name kann auf zwei Arten angepasst werden : Er kann mithilfe einer ImplicitNamingStrategy automatisch abgeleitet oder mithilfe von Anmerkungen explizit definiert werden .

Die ImplicitNamingStrategy regelt, wie Hibernate einen logischen Namen aus unseren Java-Klassen- und Eigenschaftsnamen ableitet. Wir können aus vier integrierten Strategien auswählen oder unsere eigenen erstellen.

In diesem Beispiel verwenden wir die Standardstrategie ImplicitNamingStrategyJpaCompliantImpl. Bei Verwendung dieser Strategie stimmen die logischen Namen mit unseren Java-Klassen- und Eigenschaftsnamen überein.

Wenn wir für eine bestimmte Entität von dieser Strategie abweichen möchten, können wir diese Anpassungen mithilfe von Anmerkungen vornehmen . Wir können die Annotation @Table verwenden , um den Namen einer @Entity anzupassen . Für eine Eigenschaft können wir die Annotation @Column verwenden :

@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 }

Bei Verwendung dieser Konfiguration lauten die logischen Namen für die Kundenentität und ihre Eigenschaften wie folgt:

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

4. Strategie für die physische Benennung

Nachdem wir unsere logischen Namen konfiguriert haben, werfen wir einen Blick auf unsere physischen Namen.

Hibernate verwendet die Strategie für physische Namen, um unsere logischen Namen einer SQL-Tabelle und ihren Spalten zuzuordnen.

Standardmäßig entspricht der physische Name dem logischen Namen , den wir im vorherigen Abschnitt angegeben haben . Wenn wir die physischen Namen anpassen möchten, können wir eine benutzerdefinierte PhysicalNamingStrategy- Klasse erstellen .

Beispielsweise möchten wir möglicherweise Kamelfallnamen in unserem Java-Code verwenden, aber wir möchten durch Unterstriche getrennte Namen für unsere tatsächlichen Tabellen- und Spaltennamen in der Datenbank verwenden.

Jetzt können wir eine Kombination aus Anmerkungen und einer benutzerdefinierten ImplicitNamingStrategy verwenden , um diese Namen korrekt zuzuordnen. Hibernate 5 bietet jedoch die PhysicalNamingStrategy , um diesen Prozess zu vereinfachen. Es übernimmt unsere logischen Namen aus dem vorherigen Abschnitt und ermöglicht es uns, sie alle an einem Ort anzupassen.

Mal sehen, wie das gemacht wird.

Zuerst erstellen wir eine Strategie, die unsere Kamelfallnamen in unser Standard-SQL-Format konvertiert:

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); } }

Schließlich können wir Hibernate anweisen, unsere neue Strategie anzuwenden:

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

Unter Verwendung unserer neuen Strategie gegen die Kundenentität wären die physischen Namen:

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

5. Schlussfolgerung

In diesem kurzen Artikel haben wir die Beziehung zwischen der impliziten und der physischen Namensstrategie kennengelernt.

Wir haben auch gesehen, wie die impliziten und physischen Namen einer Entität und ihrer Eigenschaften angepasst werden.

Sie können den Quellcode für dieses Tutorial auf Github anzeigen.