春のデータ注釈
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はこれを自動的に行うことに注意してください。