작성
·
181
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
1
안녕하세요. gusdn85554님 좋은 질문입니다.
하이버네이트는 내부에 최적화 기능이있습니다.
JPQL을 실행할 때 사실 모든 내용을 다 플러시 하는 것이 아니라, 해당 JPQL과 관련 있는 엔티티만 플러시합니다.
더 자세한 내용은 다음을 참고해주세요^^
https://www.inflearn.com/questions/188207
감사합니다.
아.. 관련 있는 엔티티만 플러시하는군요!! 감사합니다