1. 概要

Hibernate 5は、Hibernateエンティティで使用するための2つの異なる命名戦略を提供します。暗黙的な命名戦略と物理的な命名戦略です。

このチュートリアルでは、エンティティをカスタマイズされたテーブル名と列名にマップするようにこれらの命名戦略を構成する方法を説明します。

Hibernateを初めて使用する読者は、紹介記事を確認してください。

2. 依存関係

このチュートリアルでは、基本的なHibernateCore依存関係を使用します。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.3.6.Final</version>
</dependency>

3. 暗黙の命名戦略

Hibernateは論理名を使用して、エンティティーまたは属性名をテーブル名または列名にマップします。 この名前は、2つの方法でカスタマイズできます ImplicitNamingStrategy を使用して自動的に導出するか、注釈を使用して明示的に定義できます。

ImplicitNamingStrategy は、HibernateがJavaクラスとプロパティ名から論理名を取得する方法を管理します。 4つの組み込み戦略から選択することも、独自の戦略を作成することもできます。

この例では、デフォルトの戦略 ImplicitNamingStrategyJpaCompliantImplを使用します。この戦略を使用すると、論理名はJavaクラスおよびプロパティ名と同じになります。

特定のエンティティについてこの戦略から逸脱したい場合は、注釈を使用してそれらのカスタマイズを行うことができます @Table アノテーションを使用して、@Entityの名前をカスタマイズできます。 プロパティには、@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
    
}

この構成を使用すると、Customerエンティティとそのプロパティの論理名は次のようになります。

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

4. 物理的な命名戦略

論理名を構成したので、物理名を見てみましょう。

Hibernateは、物理命名戦略を使用して、論理名をSQLテーブルとその列にマップします。

デフォルトでは、物理名は前のセクションで指定した論理名と同じになります。物理名をカスタマイズする場合は、カスタムを作成できます。 ]PhysicalNamingStrategyクラス。

たとえば、Javaコードでキャメルケース名を使用したいが、データベースの実際のテーブル名と列名にはアンダースコアで区切られた名前を使用したい場合があります。

これで、アノテーションとカスタム ImplicitNamingStrategy の組み合わせを使用してこれらの名前を正しくマップできますが、Hibernate5はこのプロセスを簡素化する方法としてPhysicalNamingStrategyを提供します。 前のセクションの論理名を使用して、すべてを1か所でカスタマイズできます。

これがどのように行われるか見てみましょう。

まず、キャメルケース名をより標準的なSQL形式を使用するように変換する戦略を作成します。

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

最後に、Hibernateに新しい戦略を使用するように指示できます。

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

Customer エンティティに対する新しい戦略を使用すると、物理名は次のようになります。

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

5. 結論

この簡単な記事では、暗黙的および物理的な命名戦略の関係を学びました。

また、エンティティとそのプロパティの暗黙的および物理的な名前をカスタマイズする方法も確認しました。

このチュートリアルのソースコードは、Githubで確認できます。