Konfiguration der Hibernate 5-Benennungsstrategie

Konfiguration der Benennungsstrategie für Ruhezustand 5

1. Überblick

Hibernate 5 bietet zwei verschiedene Benennungsstrategien für die Verwendung mit Hibernate-Entitäten: eine implizite Benennungsstrategie und eine physikalische 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 unbedingt unsereintroduction article here.

2. Abhängigkeiten

Wir werden diebasic Hibernate Core dependency für dieses Tutorial verwenden:


    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 Namecan be customized in two ways: Er kann automatisch mithilfe vonImplicitNamingStrategy abgeleitet oder mithilfe von Anmerkungen. explizit definiert werden

DasImplicitNamingStrategy regelt, wie Hibernate einen logischen Namen von unseren Java-Klassen- und Eigenschaftsnamen ableitet. We can select from four built-in strategies, or we can create our own.

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

If we want to deviate from this strategy for a specific entity, we can use annotations to make those customizations. Wir können die Annotation@Table verwenden, um den Namen eines@Entity anzupassen. Für eine Eigenschaft können wir die Annotation@Columnverwenden:

@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 EntitätCustomerund 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 Physical Naming Strategy, um unsere logischen Namen einer SQL-Tabelle und ihren Spalten zuzuordnen.

By default, the physical name will be the same as the logical name, die wir im vorherigen Abschnitt angegeben haben. Wenn wir die physischen Namen anpassen möchten, können wir eine benutzerdefiniertePhysicalNamingStrategy-Klasse erstellen.

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

Jetzt könnten wir eine Kombination aus Anmerkungen und benutzerdefiniertenImplicitNamingStrategy verwenden, um diese Namen korrekt zuzuordnen, aber Hibernate 5 bietet diePhysicalNamingStrategy, 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 geht.

Zunächst erstellen wir eine Strategie, mit der unsere Kamelfallnamen in unser Standard-SQL-Format konvertiert werden:

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.example.hibernate.namingstrategy.CustomPhysicalNamingStrategy

Unter Verwendung unserer neuen Strategie gegen die EntitätCustomerlauten die physischen Namen:

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

5. Fazit

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 Tutorialover on Github anzeigen.