1概要
Hibernate 5には、Hibernateエンティティで使用するための2つの異なる命名戦略があります。それは、暗黙の命名戦略と物理的な命名戦略です。
このチュートリアルでは、エンティティをカスタマイズされたテーブル名と列名にマッピングするようにこれらの命名方法を設定する方法を説明します。
Hibernateに不慣れな読者のために、私達のhttps://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate[ここの紹介記事]をチェックするようにしてください。
2依存関係
このチュートリアルではhttps://search.maven.org/search?q=g:org.hibernate%20AND%20a:hibernate-core[basic Hibernate Core依存関係]を使用します。
<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はPhysical Naming Strategyを使用して、論理名をSQLテーブルとその列にマッピングします。
-
デフォルトでは、物理名は前のセクションで指定した論理名と同じになります 物理名をカスタマイズしたい場合は、カスタム PhysicalNamingStrategy クラスを作成できます。
たとえば、Javaコードではラクダのケース名を使用したいが、データベース内の実際のテーブル名と列名にはアンダースコアで区切った名前を使用します。
さて、これらの名前を正しくマッピングするためにアノテーションとカスタム ImplicitNamingStrategy の組み合わせを使用することができますが、Hibernate 5はこのプロセスを単純化する方法として PhysicalNamingStrategy を提供します。
それは前のセクションから私たちの論理名を取り、私たちが一箇所でそれらすべてをカスタマイズすることを可能にします。
これがどのように行われるかを見てみましょう。
まず、ラクダのケース名をより標準的な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 -> customers
firstName -> first__name
lastName -> last__name
emailAddress -> email
5結論
この簡単な記事では、暗黙的命名戦略と物理的命名戦略の関係について学びました。
また、エンティティの暗黙的および物理的な名前とそのプロパティをカスタマイズする方法も説明しました。
あなたはこのチュートリアルのソースコードを見ることができます。https://github.com/eugenp/tutorials/tree/master/persistence-modules/hibernate5[Githubでオーバー]]。