1. 序章

Spring Data JPAは、アプリケーションでJPAを使用するための多くの機能を提供します。 これらの機能の中には、DDLクエリとDMLクエリの両方でテーブル名と列名の標準化があります。

この短いチュートリアルでは、このデフォルトの命名規則を構成する方法を説明します。

2. デフォルトの命名規則

まず、テーブル名と列名に関するSpringのデフォルトの命名規則を見てみましょう。

Personentityがあると想像してみましょう。

@Entity
public class Person {
    @Id
    private Long id;
    private String firstName;
    private String lastName;
}

ここには、データベースにマップする必要のある名前がいくつかあります。 Springはデフォルトで小文字のスネークケースを使用します。つまり、小文字のみを使用し、単語をアンダースコアで区切ります。 したがって、Personエンティティのテーブル作成クエリは次のようになります。

create table person (id bigint not null, first_name varchar(255), last_name varchar(255), primary key (id));

そして、すべての名を返す選択クエリは次のようになります。

select first_name from person;

そのために、SpringはHibernateのPhysicalNamingStrategyのバージョンであるSpringPhysicalNamingStrategyを実装しました。

3. RDMSの大文字と小文字の区別

カスタム命名規則を作成する方法の詳細に入る前に、RDMSが識別子の大文字と小文字をどのように管理しているかについて少し話しましょう。

考慮すべき2つのシナリオがあります。RDMSでは大文字と小文字が区別されるか、そうでないかです。

最初の状況では、RDMSは同じケースを持つ識別子と厳密に一致します。 したがって、この例では、次のクエリが機能します。

select first_name from person;

これはエラーをスローし、結果を返すことさえありませんが:

select FIRST_NAME from PERSON;

一方、大文字と小文字を区別しないRDMSの場合、両方のクエリが機能します。

RDMSがケースに関しても識別子と一致するように強制するにはどうすればよいですか? 引用符で囲まれた識別子(たとえば、「person」)を使用できます。

識別子を引用符で囲むことにより、これらの識別子をテーブル名や列名と比較する場合にも一致する必要があることをデータベースに通知します。 したがって、この例を引き続き使用すると、次のクエリが機能します。

select "first_name" from "person";

これはしませんが:

select "first_name" from "PERSON";

ただし、理論的には、各RDMSが引用符で囲まれた識別子を独自の方法で管理するため、マイレージは異なります

4. カスタム命名規則

それでは、独自の命名規則を実装しましょう。

Spring下部スネークケース戦略を使用できないが、上部スネークケースを使用する必要があると想像してください。 次に、PhysicalNamingStrategyの実装を提供する必要があります。

スネークケースを使用するため、最速のオプションは SpringPhysicalNamingStrategy から継承し、識別子を大文字に変換することです。

public class UpperCaseNamingStrategy extends SpringPhysicalNamingStrategy {
    @Override
    protected Identifier getIdentifier(String name, boolean quoted, JdbcEnvironment jdbcEnvironment) {
        return new Identifier(name.toUpperCase(), quoted);
    }
}

スーパークラスで識別子を小文字に変換するgetIdentifier()メソッドをオーバーライドしているだけです。 ここでは、大文字に変換するために使用しています。

実装を作成したら、Hibernateがそれを使用することを認識できるように登録する必要があります。 Springを使用する場合、これは、application.propertiesでspring.jpa.hibernate.naming.physical-strategyプロパティ設定することで実行されます。

spring.jpa.hibernate.naming.physical-strategy=com.baeldung.namingstrategy.UpperCaseNamingStrategy

現在、クエリでは大文字の識別子を使用しています。

create table PERSON (ID bigint not null, FIRST_NAME varchar(255), LAST_NAME varchar(255), primary key (ID));

select FIRST_NAME from PERSON;

RDMSがケースと一致するように強制されるように、引用符で囲まれた識別子を使用するとします。 次に、 Identifier()コンストラクターの引用符で囲まれた引数としてtrueを使用する必要があります

@Override
protected Identifier getIdentifier(String name, boolean quoted, JdbcEnvironment jdbcEnvironment) {
    return new Identifier(name.toUpperCase(), true);
}

クエリが引用符で囲まれた識別子を提示した後:

create table "PERSON" ("ID" bigint not null, "FIRST_NAME" varchar(255), "LAST_NAME" varchar(255), primary key ("ID"));

select "FIRST_NAME" from "PERSON";

5. 結論

この短い記事では、Spring Data JPAを使用してカスタム命名戦略を実装する可能性と、RDMSが内部構成に関するDDLおよびDMLステートメントを処理する方法について説明しました。

いつものように、この記事の完全なコードはGitHubにあります。