2017-03-27 19 views
1

たとえば、私はJpaRepositoryという本を持っています。 BookにはNameというフィールドがあり、bookリポジトリにはfindOneByNameというメソッドがあります(jpaリポジトリメソッド命名規則)。しかし、異なるユースケースで使用するには、2つの異なるバージョンのfindOneByNameが必要です。 1つのバージョンはロック注釈付きであり、もう1つはロックフリーです。このように:Spring Data JPAリポジトリのメソッドオーバーロード

public interface BookRepository extends JpaRepository<BookDAO, Long> { 

    @Lock(LockModeType.READ) 
    BookDAO findOneByName(String name); 

    BookDAO findOneByName(String name); 
} 

これを春に行うことは可能ですか?そうであれば、2つのメソッドを呼び出すときにそれらのメソッドを区別する方法。そうでなければ、SpringのJPAリポジトリインタフェース(findOneBy ***など)を使用している間に、別の方法でそれを行うことができます。

+0

私はちょうどそれらのいずれかのクエリメソッドを使用しません。私は@Lockのための新しいメソッドを作成し、 'findOneByNameWithLock(name)'のようなものを呼び出します。次に、@Queryアノテーションを使用して、そのクエリを指定します。 – LucasP

+0

いいえ、これは好きではありません(そして、Springとは関係ありませんが、Javaの仕組み)。 –

+0

@ M.Deinumありがとうございます。このユースケースに関して建設的な提案がありますか?どのように別の方法でそれを行うには? –

答えて

1

私はそれがあなたのやり方でできるかどうか分かりません。しかし、私はさまざまな方法

public interface BookRepository extends JpaRepository<BookDAO, Long> { 

    @Lock(LockModeType.READ) 
    @Query("select b from Book b where b.name = :name") 
    BookDAO findOneByNameForRead(String name); 

    BookDAO findOneByName(String name); 

} 

を作成したりあなたの代わりにロックする処理するために、スプリングjparepositoryを使用してあなたのサービス層のメソッドを作成することができます。更新されるために必要とされる場所を渡ってそれを使用し、すべてが referenceによると、我々はこれらのプレフィックスを持つクエリーメソッド名前を付けることができます

@PersistenceContext 
private EntityManager em; 
... 

public Book findOneBookForUpdate(String id) { 

    Book book = em.find(Book.class, id); 
    if (book != null) { 
     em.lock(book, LockModeType.PESSIMISTIC_WRITE); 
    } 

    return book; 
} 
+0

これは動作しません。 2番目のメソッドは、最初のメソッドへの直接呼び出しに相当する最初のメソッドを呼び出します。 –

+0

あなたは正しいです、私の答えを編集しました – surya

1

(真読み取り専用=)@Transactionalとしてマークされたメソッド読み:find…Byread…Byquery…Byを、 count…Byおよびget…Byである。

したがって、BookDAO findByName(String name)BookDAO getByName(String name)のメソッドは同じことを行います。

関連する問題