2017-03-27 2 views
1

예를 들어 JpaRepository라는 책이 있습니다. 책의 필드가 Name이라면 책 저장소에는 findOneByName (jpa 저장소 메소드 이름 지정 규칙) 방법이 있습니다. 하지만 다른 사용 사례에서 사용하려면 findOneByName의 두 가지 버전이 필요합니다. 하나의 버전은 입니다. 잠금은이며, 다른 하나는 입니다. 잠금 해제입니다. 이처럼 :스프링 데이터 JPA 저장소 메소드 오버로드

public interface BookRepository extends JpaRepository<BookDAO, Long> { 

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

    BookDAO findOneByName(String name); 
} 

는 봄이를 달성 할 수 있습니까? 그렇다면 두 가지 방법을 호출 할 때 구별하는 방법. 그렇지 않다면 Spring JPA 저장소 인터페이스 (예 : findOneBy ***)를 사용하면서 다른 방법으로 그것을 수행 할 수 있습니까?

+0

나는 그들 중 하나에 대해서만 Query 메소드를 사용하지 않을 것이다. @Lock 메소드를위한 새로운 메소드를 만들고'findOneByNameWithLock (name)'과 같은 메소드를 호출 할 것입니다. 그런 다음 @Query 어노테이션을 사용하고 이에 대한 질의를 지정하십시오. – LucasP

+0

아니요, 이러면 안됩니다 (스프링과는 관계가 없지만 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

작동하지 않습니다. 두 번째 메서드는 첫 번째 메서드를 직접 호출하는 것과 동일한 첫 번째 메서드를 호출합니다. –

+0

당신은 정확합니다, 내 대답을 편집했습니다. – surya

1

(사실 때문에 readOnly =) @Transactional로 표시 방법을 읽어 find…By, read…By, query…By을, count…Byget…By.

따라서 BookDAO findByName(String name)BookDAO getByName(String name)은 동일한 작업을 수행합니다.

관련 문제