Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

JPA Hint & Lock 본문

인프런/[인프런] Spring Data JPA

JPA Hint & Lock

Seung__ 2021. 8. 29. 23:33

1. JPA Hint???


  • JPA 쿼리 힌트(SQL 힌트가 아니라 JPA 구현체인 hibernate에 제공하는 힌트)

 

 

2. 쿼리 힌트 사용


  • org.springframework.data.jpa.repository.QueryHints 어노테이션을 사용
  • "org.hiberante.readOnly"가 적용되면 해당 메서드에 대해 스냅샷 만들지 않고,
    따라서 변경감지도 하지 않음.
//org.hibernate.readOnly를 hiberante가 열어놨다!
//readOnly가 적용되면 영속성 컨텍스트에 스냅샷 안만들어 놓음.
@QueryHints(value= @QueryHint(name = "org.hibernate.readOnly", value = "true"))
Member findReadOnlyByUserName(String userName);
  • 아래처엄 엔티티를 불러와서 변경을 해도 readOnly가 적용되어 
  • 스냅샷도 없고, 따라서 변경감지가 되지 않아 DB에 반영이안됨 ㅋㅋㅋ 
   @Test
    public void queryHint(){
        //given
        Member member1 = new Member("member1", 10);
        memberRepository.save(member1);
        em.flush();
        em.clear();

        //when
        Member findMember = memberRepository.findReadOnlyByUserName("member1");
        findMember.setUserName("member2");

        em.flush();

    }

 

 

  • forCounting : 반환 타입으로 Page 인터페이스를 적용하면 추가로 호출하는 
    페이징을 위한 count 쿼리도 쿼리 힌트 적용(기본값 true )

 

 

 

3. Lock : JPA에서 제공하는 lock을 편하게 사용할 수 있다.


@Lock(LockModeType.PESSIMISTIC_WRITE)
List<Member> findByUsername(String name);
@Test
    public void lock(){
        //given
        Member member1 = new Member("member1", 10);
        memberRepository.save(member1);
        em.flush();
        em.clear();

        //when
        List<Member> members = memberRepository.findLockByUserName("member1");


    }
  • ???update
    select
        member0_.member_id as member_i1_0_,
        member0_.age as age2_0_,
        member0_.team_id as team_id4_0_,
        member0_.user_name as user_nam3_0_ 
    from
        member member0_ 
    where
        member0_.user_name=? for update

lock은 JPA책을통해 공부해봐야것다..

4. GitHub : 210829 JPA Hint, Lock


 

GitHub - bsh6463/SpringDataJpa

Contribute to bsh6463/SpringDataJpa development by creating an account on GitHub.

github.com

 

 

'인프런 > [인프런] Spring Data JPA' 카테고리의 다른 글

Auditing  (0) 2021.08.30
사용자 정의 Repository  (0) 2021.08.30
@EntityGraph  (0) 2021.08.29
Query Method, 벌크성 수정 쿼리  (0) 2021.08.29
SpringDataJpa 페이징, 정렬  (0) 2021.08.29
Comments