작성
·
739
0
public void test() {
OrderInfo orderInfo = new OrderInfo();
orderInfo.setStatus("test");
oRepo.save(orderInfo);
OrderInfo findOrderInfo = oRepo.findById(orderInfo.getId()).get();
findOrderInfo.setStatus("zzzzzzz");
}
위와 같은 코드가 있다고 할 때
Open session In view 설정과 @Transactional 에 따라서 dirty checking 되는 로직에 대해서 질문드립니다.
1.
Open Session in View : true
@Transactional : 사용 안함
Hibernate: call next value for hibernate_sequence
Hibernate: insert into order_info (status, id) values (?, ?)
Hibernate: select orderinfo0_.id as id1_0_0_, orderinfo0_.status as status2_0_0_ from order_info orderinfo0_ where orderinfo0_.id=?
2.
Open Session in View : false
@Transactional : 사용 안함
Hibernate: call next value for hibernate_sequence
Hibernate: insert into order_info (status, id) values (?, ?)
3.
Open Session in View : true
@Transactional : 사용
Hibernate: call next value for hibernate_sequence
Hibernate: insert into order_info (status, id) values (?, ?)
Hibernate: update order_info set status=? where id=?
4.
Open Session in View : false
@Transactional : 사용
Hibernate: call next value for hibernate_sequence
Hibernate: insert into order_info (status, id) values (?, ?)
Hibernate: update order_info set status=? where id=?
1 번의 경우 영속성 컨텍스트가 각각의 트랜잭션에서 끝나서 select 문이 나가는 것으로 보입니다.
2번의 경우 OSIV로 인해 영속성 컨텍스트가 끝까지 남아서 select문이 안나가는 것으로 보입니다.
3번의 경우도 OSIV와 Transaction으로 인해 영속성 컨텍스트안에 있는 객체를 가져오기에 select 문이 안나가는 것으로 보입니다. 그 후 dirty checking 으로 인해 update 문이 발생합니다.
4번의 경우 트랜잭션 범위내에 있는 영속성 컨텍스트에서 찾아오기에 select문이 안나가는 것으로 보입니다. 그 후 dirty checking 으로 인해 update 문이 발생합니다.
dirty checking 의 경우 영속성 컨텍스트가 관리하고 있는 엔티티에 대해서 스냅샷을 저장 후 변경이 되면 나가는 것으로 알고 있습니다.
그럼 이 때 2번의 경우 영속성 컨텍스트가 남아서 select문이 안나간다고 생각을 하는데 왜 dirty checking 이 안되는 이유가 있을까요??