본문 바로가기

Spring/jpa

[spring data jpa] spring data - jpa

Common 을 기반으로 만든 jpaRepository 를 봐보자

 

boot 를 사용하지 않으면

어노테이션을 붙여야 사용가능하다

여기서 BaseRepository 들을 설정 할 수 있다.

 

@Repository 를 안붙여도 된다 이미 중복

JpaRepository 구현체인 SimpleJpaRepository 에 이미 @Repository 가 들어가있다.

근데 붙어있어야 좋은 이유는 빈으로 등록도 되고

예외를 DataAccessException 으로 바꿔주기 때문

 

 

Jpa : 엔티티 저장하기

 

Transient 상태의 객체면 EntityManager.persist()

Detached 상태면 EntityManager.merge() 가 된다.

 

Detached 인지 어떻게 판단하는지?

엔티티의 @Id 프로퍼티를 찾아서  id 가 null 이 아니면 Detached 상태로 판단한다

 

 

persist()

 

merge()

 

JPA 쿼리 메소드

 

NavedQuery 는 엔티티 에서 쿼리를 정의해서 쓸 수 있다.

하지만 도메인 엔티티 클래스가 너무 복잡해진다.

이거보다는 사실 @Query 를 쓰는게 좋다

 

 

Sort

@Query 에서 Pageable , Sort  를 사용할땐?

Sort는 이렇게 프로퍼티를 줘서 사용한다.

하지만 함수 같은 걸 줄땐 사용이 불가능

이걸 우회하려면 

JpaSort.unsafe 라는 메소드를 써서 우회할 수 있다.

 

Named Parameter

 

@Param 으로 값을 줄 수 있다.

 

Update 쿼리 메소드

주로 update 는 persistentContext가 상태 객체를 관리하다가

상태가 변화가 일어났고 변화를 db 에 넣으려고 할때

flush 를 하는데 , 그 때 보통 update 쿼리가 실행이 된다.

그래서 우리가 굳이 update 를 만들어 쓰지 않는다 거의

 

하지만, 성능 상의 이유로 update 를 너무 많이 호출을 할때

직접 정의 해서 사용은 할 수 있다.

 

select 쿼리가 아닌 update 라는걸 @Modifying 으로 알려줘야한다.

굳이 줘야하나 싶긴하다

 

추천 하진 않는 방법이다.

로 update 후 find 를 했는데 여전히 hibernate 로 바뀌지 않아있다.

왜냐?

update 후에 select 를 안하기 때문이다.

왜 안할까? 

 

아직 트랜잭션이 안끝나서 저 spring 객체는 아직 persistent 상태다

1차캐시 즉 persitentContext 가 가지고 있어서

db로 아직 안갔고 저 상태에서 select 를 하면 spring 의 데이터가 나오게된다

 

이렇게 어플리케이션 로직으로 푸는게 맞다고함

 

저기선 hibernate 라고 잘 나온다.

spring 객체 1차 캐시에 적용이 되어있기때문에

 

EntityGraph

 

 

 

 

 

여기서 그룹의 이름은 Commnet.post 고

attributeNodes 에 post 를 설정해놨다

 

기본값: FETCH 가

설정한 엔티티 애트리뷰트는 EAGER 로 가져오고

나머지 필드들이 LAZY로 가져와진다.