member1("john") 엔티티를 생성후 저장
john 엔티티의 이름 james 로 update 진행
member1의 이름이 james로 반영되었는지 확인하였지만 실패하였습니다. 바뀌기전의 그대로 john 이었습니다.
DB에는 james 로 잘 반영이 되었지만 결과를 확인하고, 이유를 찾아본 결과 jpa update 는 영속성 컨텍스트를 거치지 않고 DB직접 날린다고 나와있네요..
자 그렇다면 update 후 select를 해봅시다. 이번에도 이름이 바뀌지 않은 엔티티가 조회되었습니다.
이유를 찾아보았습니다.. 영속성컨텍스트안에 동일한 엔티티가 존재할경우 DB를 거치지 않고 영속성 컨텍스트에서 1차 캐싱을 하여 해당 엔티티를 가져온다고 하는군요.
왜 최신화된 엔티티를 가져오지 않을까에 대한 의구심을 품었습니다.
"엔티티의 동일성 보장" 이 이유라고 하는군요 어렵습니다. 혹시 이 동일성 보장이라는 개념을 어떻게 이해해야 할까요
여기서 궁금증은 직접 db로 update 한후에 최신화 된 엔티티를 왜 다시 영속성 컨텍스트에 넣지 않는가 ? (기존 엔티티 삭제하고)
애초에 이 질문 자체가 잘못된 것 같기도 하군요 update하기위해선 영속성 컨텍스트를 비우고 날려야 한다로 생각해야 하는지 생각이 복잡해집니다.
update sql 결과가 변경된 row의 갯수만 반환 -> 컨텍스트 자동으로 업데이트할 근거가 없음. 네가 주의해서 써야함
엔티티를 반환하는 것이 아닌 row 갯수만 반환하기 때문이다.. 즉 컨텍스트를 먼저 비우고 날리는것이 맞군요
update를 따로 쳐줬다는 거임?
JPA 를 사용하여 UPDATE 를 진행할때 발생하는 과정에 의구심을 가진것 일 뿐입니다.
아니 JPA를 쓰는데 update를 sql이든 jpql이든 따로 쳤냐고 물어보는거임. 정황상 엔티티를 수정한게 아니라 모종의 방법으로 update를 날렸다는거 아님?