Springデータアノテーション

春のデータ注釈

1. 前書き

Spring Dataは、データストレージテクノロジーを抽象化します。 したがって、ビジネスロジックコードは、基になる永続化実装からはるかに独立しています。 また、Springは実装に依存するデータストレージの詳細の処理を簡素化します。

このチュートリアルでは、Spring Data、Spring Data JPA、およびSpring DataMongoDBプロジェクトの最も一般的なアノテーションを確認します。

2. 一般的なSpringデータの注釈

2.1. @Transactional

configure the transactional behavior of a methodにしたい場合は、次の方法で実行できます。

@Transactional
void pay() {}

このアノテーションをクラスレベルで適用すると、クラス内のすべてのメソッドで機能します。 ただし、特定のメソッドに適用することで、その効果をオーバーライドできます。

this articleにある多くの構成オプションがあります。

2.2. @NoRepositoryBean

Sometimes we want to create repository interfaces with the only goal of providing common methods for the child repositories

もちろん、SpringにこれらのリポジトリのBeanを作成させたくないのは、それらをどこにも注入しないからです。 @NoRepositoryBean はまさにこれを行います。org.springframework.data.repository.Repositoryの子インターフェースをマークすると、SpringはそれからBeanを作成しません。

たとえば、すべてのリポジトリでOptional<T> findById(ID id) メソッドが必要な場合は、ベースリポジトリを作成できます。

@NoRepositoryBean
interface MyUtilityRepository extends CrudRepository {
    Optional findById(ID id);
}

このアノテーションは子インターフェースには影響しません。したがって、Springは次のリポジトリインターフェース用のBeanを作成します。

@Repository
interface PersonRepository extends MyUtilityRepository {}

古いT findOne(ID id)を置き換えるこのメソッドを含むSpring Dataバージョン2以降、上記の例は必要ないことに注意してください。

2.3. @Param

@Paramを使用して、名前付きパラメーターをクエリに渡すことができます。

@Query("FROM Person p WHERE p.name = :name")
Person findByName(@Param("name") String name);

:name syntaxでパラメーターを参照することに注意してください。

その他の例については、this articleにアクセスしてください。

2.4. @Id

@Id は、モデルクラスのフィールドを主キーとしてマークします。

class Person {

    @Id
    Long id;

    // ...

}

実装に依存しないため、モデルクラスを複数のデータストアエンジンで簡単に使用できます。

2.5. @Transient

この注釈を使用して、モデルクラスのフィールドを一時的なものとしてマークできます。 したがって、データストアエンジンはこのフィールドの値を読み書きしません。

class Person {

    // ...

    @Transient
    int age;

    // ...

}

@Idと同様に、@Transient isも実装に依存しないため、複数のデータストア実装で使用すると便利です。

2.6. @CreatedBy@LastModifiedBy@CreatedDate@LastModifiedDate

これらの注釈を使用して、モデルクラスを監査できます。Springは、注釈付きフィールドに、オブジェクトを作成したプリンシパル、最後に変更したプリンシパル、作成日、最終変更日を自動的に設定します。

public class Person {

    // ...

    @CreatedBy
    User creator;

    @LastModifiedBy
    User modifier;

    @CreatedDate
    Date createdAt;

    @LastModifiedDate
    Date modifiedAt;

    // ...

}

Springにプリンシパルを設定する場合は、Spring Securityも使用する必要があることに注意してください。

詳細については、this articleにアクセスしてください。

3. Spring Data JPAアノテーション

3.1. @Query

@Queryを使用すると、リポジトリメソッドのJPQL実装を提供できます。

@Query("SELECT COUNT(*) FROM Person p")
long getPersonCount();

また、名前付きパラメーターを使用できます。

@Query("FROM Person p WHERE p.name = :name")
Person findByName(@Param("name") String name);

さらに、nativeQuery argumentをtrueに設定すると、ネイティブSQLクエリを使用できます。

@Query(value = "SELECT AVG(p.age) FROM person p", nativeQuery = true)
int getAverageAge();

詳細については、this articleにアクセスしてください。

3.2. @Procedure

Spring Data JPAを使用すると、リポジトリからストアドプロシージャを簡単に呼び出すことができます。

最初に、標準のJPAアノテーションを使用してエンティティクラスでリポジトリを宣言する必要があります。

@NamedStoredProcedureQueries({
    @NamedStoredProcedureQuery(
        name = "count_by_name",
        procedureName = "person.count_by_name",
        parameters = {
            @StoredProcedureParameter(
                mode = ParameterMode.IN,
                name = "name",
                type = String.class),
            @StoredProcedureParameter(
                mode = ParameterMode.OUT,
                name = "count",
                type = Long.class)
            }
    )
})

class Person {}

この後、name argumentで宣言した名前でリポジトリ内でそれを参照できます。

@Procedure(name = "count_by_name")
long getCountByName(@Param("name") String name);

3.3. @Lock

リポジトリクエリメソッドを実行するときにロックモードを構成できます。

@Lock(LockModeType.NONE)
@Query("SELECT COUNT(*) FROM Person p")
long getPersonCount();

利用可能なロックモード:

  • READ

  • 書く

  • 楽観的

  • OPTIMISTIC_FORCE_INCREMENT

  • PESSIMISTIC_READ

  • PESSIMISTIC_WRITE

  • PESSIMISTIC_FORCE_INCREMENT

  • NONE

3.4. @Modifying

@Modifyingで注釈を付けると、リポジトリメソッドを使用してデータを変更できます。

@Modifying
@Query("UPDATE Person p SET p.name = :name WHERE p.id = :id")
void changeName(@Param("id") long id, @Param("name") String name);

詳細については、this articleにアクセスしてください。

3.5. @EnableJpaRepositories

JPAリポジトリを使用するには、Springに指定する必要があります。 これは@EnableJpaRepositories.で実行できます

このアノテーションは@Configurationで使用する必要があることに注意してください。

@Configuration
@EnableJpaRepositories
class PersistenceJPAConfig {}

Springは、この@Configuration classのサブパッケージでリポジトリを探します。

この動作は、basePackages argumentを使用して変更できます。

@Configuration
@EnableJpaRepositories(basePackages = "org.example.persistence.dao")
class PersistenceJPAConfig {}

また、クラスパス上でSpring Data JPAを検出すると、Spring Bootがこれを自動的に行うことに注意してください。

4. Spring Data Mongoアノテーション

Spring Dataを使用すると、MongoDBの操作がはるかに簡単になります。 次のセクションでは、Spring DataMongoDBの最も基本的な機能について説明します。

詳細については、article about Spring Data MongoDBをご覧ください。

4.1. @Document

この注釈は、クラスをデータベースに永続化するドメインオブジェクトとしてマークします。

@Document
class User {}

また、使用するコレクションの名前を選択することもできます。

@Document(collection = "user")
class User {}

このアノテーションは、JPAの@Entity に相当するMongoであることに注意してください。

4.2. @Field

@Fieldを使用すると、MongoDBがドキュメントを永続化するときに使用するフィールドの名前を構成できます。

@Document
class User {

    // ...

    @Field("email")
    String emailAddress;

    // ...

}

このアノテーションは、JPAの@Column に相当するMongoであることに注意してください。

4.3. @Query

@Queryを使用すると、MongoDBリポジトリメソッドでファインダークエリを提供できます。

@Query("{ 'name' : ?0 }")
List findUsersByName(String name);

4.4. @EnableMongoRepositories

MongoDBリポジトリを使用するには、Springに指定する必要があります。 これは@EnableMongoRepositories.で実行できます

このアノテーションは@Configurationで使用する必要があることに注意してください。

@Configuration
@EnableMongoRepositories
class MongoConfig {}

Springは、この@Configuration classのサブパッケージでリポジトリを探します。 この動作は、basePackages argumentを使用して変更できます。

@Configuration
@EnableMongoRepositories(basePackages = "org.example.repository")
class MongoConfig {}

また、クラスパス上でSpring Data MongoDBが見つかった場合、Spring Bootはこれを自動的に行うことに注意してください。

5. 結論

この記事では、Springを使用して、一般的にデータを処理するために必要な最も重要な注釈を確認しました。 さらに、最も一般的なJPAおよびMongoDBアノテーションを調べました。

いつものように、GitHubの一般的なアノテーションとJPAアノテーションのhere、およびMongoDBアノテーションのhereで例を利用できます。