인프런 커뮤니티 질문&답변

gusdn85554님의 프로필 이미지

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

프로젝션(SELECT)

쿼리 순서

21.12.14 03:36 작성

·

175

0

안녕하십니까 복습을 하던 중에 궁금한 점이 생겨 질문드립니다!!

간결하게 작성하기 위해 코드 부분은 try 부분만 가져왔습니다. 영한님과 다른 점은 em.flush(), em.clear()가 없습니다.

1번 코드

```java

Member member = new Member();
member.setUsername("member1");
member.setAge(10);
em.persist(member);

em.createQuery("select t from Member m join m.team t", Team.class)
        .getResultList()
;

tx.commit();

```

1번 코드 쿼리 

2번 코드

```java

Member member = new Member();
member.setUsername("member1");
member.setAge(10);
em.persist(member);

em.createQuery("select o.address from Order o", Address.class)
        .getResultList()
;

tx.commit();

```

2번 코드 쿼리

 

1번의 결과는 강의에서 말씀하듯이 쿼리를 작성했기 때문에 flush, clear 호출 ->

member가 insert -> select 가 작동함을 알 수 있습니다.

 

2번의 결과는 createQuery가 먼저 실행 -> member insert 가 됩니다.

제가 처음 생각했을 때는 1차 캐시를 생각했습니다. 하지만 1차 캐시와는 연관이 없는게 현재 1차 캐시에는 member만 존재합니다. 그래서 관계가 없다고 생각했습니다.

둘째로, Order의 address를 조회하는데 member가 전혀 관련이 없어서 JPA 자체에서 쿼리를 날릴 필요가 없네 라는 생각을 하고, 먼저 select 조회를 한 뒤에, commit을 만나 member를 insert 하나? 라는 추론을 해보았습니다. 

하지만 강의에서 DB에 뭐가 있는지도 모를텐데 쿼리를 날리면 필요가 없기 때문에 flush, clear를 한다 라고 말씀하셔서 

2번의 결과가 왜 이렇게 나오는지 궁금합니다!

 

 

 

답변 2

3

David님의 프로필 이미지

2021. 12. 14. 10:59

안녕하세요. gusdn85554님, 공식 서포터즈 David입니다.

.

맥락 이해를 위해 작성하신 코드 전체를 올려주시면 좋을 것 같아요.

.

감사합니다.

1

김영한님의 프로필 이미지
김영한
지식공유자

2021. 12. 14. 23:29

안녕하세요. gusdn85554님 좋은 질문입니다.

하이버네이트는 내부에 최적화 기능이있습니다.

JPQL을 실행할 때 사실 모든 내용을 다 플러시 하는 것이 아니라, 해당 JPQL과 관련 있는 엔티티만 플러시합니다.

더 자세한 내용은 다음을 참고해주세요^^

https://www.inflearn.com/questions/188207

감사합니다.

gusdn85554님의 프로필 이미지
gusdn85554
질문자

2021. 12. 15. 16:16

아.. 관련 있는 엔티티만 플러시하는군요!! 감사합니다