Spring Data注記の説明

6419 ワード

Spring DataはSpringのサブプロジェクトであり、データベースへのアクセスをシンプル化します.Spring Dataは、データストレージ技術の抽象化を提供します.ビジネスロジックコードを、最下位レベルの永続化とは独立した実装にすることができます.現在Spring Dataは、NoSQLおよびリレーショナル・データベース・ストレージをサポートしています.
ここでは、Spring Data,Spring Data JPAおよびSpring Data MongoDBプロジェクトで最も一般的な注記について説明します.
1一般的なSpring Data注記
1.1 @Transactional
メソッドのトランザクション動作を構成する場合は、次の操作を行います.
@Transactional
void pay() {}

この注記をクラスレベルで使用する場合は、クラス内のすべてのメソッドに適用されます.しかし、特定の方法を個別に設定することもできます.
1.2 @NoRepositoryBean
サブリポジトリに共通のメソッドを提供することを目的として、リポジトリインタフェースを作成する場合があります.すなわち,この注釈を用いたインタフェースはインスタンスを単独で作成することなく,他のインタフェースの親インタフェースとしてのみ使用される.この共通インタフェースは、この注釈@NoRepositoryBeanで識別する必要があります.
たとえば、すべてのリポジトリでOptional findById(ID ID)メソッドを使用したい場合は、基本的なリポジトリを作成できます.
@NoRepositoryBean
interface MyUtilityRepository extends CrudRepository {
    Optional findById(ID id);
}

この注記はサブインタフェースに影響しません.Springは、次のサブリポジトリインタフェースのbeanを作成します.
@Repository
interface PersonRepository extends MyUtilityRepository {}


1.3 @Param
@Paramを使用して、名前付きパラメータをクエリーに渡すことができます.
@Query("FROM Person p WHERE p.name = :name")
Person findByName(@Param("name") String name);

Collectionパラメータを渡すこともできます.
@Query(value = "SELECT u FROM User u WHERE u.name IN :names")
List findUserByNameList(@Param("names") Collection names);

1.4 @ID
@Idモデルクラスのフィールドをプライマリ・キーとしてマークします.
class Person {
 
    @Id
    Long id;
 
    // ...
     
}

特定のインプリメンテーションとは無関係であるため、モデルクラスは複数のデータストレージエンジンと容易に使用できます.
1.5 @Transient
@Transientは、この属性がデータベース・テーブルへのフィールドのマッピングではないことを示し、ORMフレームワークはこの属性を無視します.属性がデータベース・テーブルのフィールド・マッピングでない場合は、@Transientとして表示する必要があります.データ・ストレージ・エンジンは、このフィールドの値を読み取りまたは書き込みません.
class Person {
 
    // ...
 
    @Transient
    int age;
 
    // ...
 
}

1.6 @CreatedBy,@ LastModifiedBy,@ ManagingDate,@ LastModifiedDate
これらの注記により、データ・モデルに監査情報を追加できます.
public class Person {
 
    // ...
 
    @CreatedBy
    User creator;
     
    @LastModifiedBy
    User modifier;
     
    @CreatedDate
    Date createdAt;
     
    @LastModifiedDate
    Date modifiedAt;
 
    // ...
 
}

2 Spring Data JPA注記
2.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パラメータをtrueに設定すると、オリジナルSQLクエリを使用できます.
@Query(value = "SELECT AVG(p.age) FROM person p", nativeQuery = true)
int getAverageAge();

2.2 @Procedure
この注記を使用すると、リポジトリからストレージ・プロシージャを簡単に呼び出すことができます.まず、標準の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パラメータで宣言した名前をリポジトリで使用して呼び出すことができます.
@Procedure(name = "count_by_name")
long getCountByName(@Param("name") String name);

2.3 @Lock
クエリー・メソッドの実行時にロック・モードを構成できます.
@Lock(LockModeType.NONE)
@Query("SELECT COUNT(*) FROM Person p")
long getPersonCount();

使用可能なロックモード:
  • READ
  • WRITE
  • OPTIMISTIC:READロックモードと同様であり、JPA 2.0はREADロックモードをサポートしているが、新しいアプリケーションでOPTIMISTICの使用を推奨することを明確に指摘している.
  • OPTIMISTIC_FORCE_INCREMENT:WRITEロックモードと同様、JPA 2.0はWRITEロックモードをサポートしていますが、新しいアプリケーションでOPTIMISTIC_を推奨していることが明らかになりました.FORCE_INCREMENT.
  • PESSIMISTIC_READ:取引がエンティティを読む限り、エンティティマネージャはエンティティをロックし、取引が完了するまでロックを解除する.繰り返し意味を使ってデータを検索したい場合、このロックモードを使用する.言い換えれば、連続リード中にデータが修正されないことを確保したい場合、このロックモードは他の取引のデータの読み取りを阻害しない.
  • PESSIMISTIC_WRITE:トランザクションがエンティティを更新する限り、エンティティマネージャはエンティティをロックします.このロックモードでは、エンティティデータのトランザクションシリアル化を強制的に変更しようとします.複数の同時更新トランザクションが更新に失敗する確率が高い場合に使用します.エンティティがトランザクションによって読み込まれると、エンティティマネージャはエンティティをロックします.エンティティが変更されていなくても、トランザクションが終了するとエンティティのバージョン属性が増加します.
  • PESSIMISTIC_FORCE_INCREMENT:
  • NONE:ロックなし
  • 2.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);
    

    2.5 @EnableJpaRepositories
    @EnableJpaRepositories注記を使用して、JPAリポジトリのオープンを指定します.このコメントは@Configurationで使用する必要があります.
    @Configuration
    @EnableJpaRepositories
    class PersistenceJPAConfig {}
    

    Springはこの@Configurationクラスのサブパッケージでリポジトリを検索します.basePackagesパラメータを使用して、パッケージのパスを変更できます.
    @Configuration
    @EnableJpaRepositories(basePackages = "org.peterwanghao.persistence.dao")
    class PersistenceJPAConfig {}
    

    3 Spring Data Mongo注記
    3.1 @Document
    この注記は、クラスをデータベースに保持するドメインオブジェクトとしてマークします.
    @Document
    class User {}
    

    また、使用するコレクションの名前を選択できます.
    @Document(collection = "user")
    class User {}
    

    この注記は、JPAの@Entityに似ています.
    3.2 @Field
    @Fieldを使用すると、MongoDB永続化でドキュメントを保存する際に使用するフィールドの名前を設定できます.
    @Document
    class User {
     
        // ...
     
        @Field("email")
        String emailAddress;
     
        // ...
     
    }
    

    この注記は、JPAの@Columnに似ています.
    3.3 @Query
    @Queryを使用すると、MongoDBリポジトリメソッドでクエリーを提供できます.
    @Query("{ 'name' : ?0 }")
    List findUsersByName(String name);
    

    3.4 @EnableMongoRepositories
    @EnableMongoRepositories注記を使用して、MongoDBリポジトリのオープンを指定します.JPAの@EnableJpaRepositoriesと似ています.
    4結論
    本稿ではSpringを使用する際にデータを処理する必要がある最も主要な注釈を見た.さらに,最も一般的なJPAとMongoDB注釈を紹介した.