해결된 질문
작성
·
241
6
질문으로 올리려다가 샘플 코드를 만들어 직접 확인한 결과를 공유합니다.
detach()로 detached된 entity를 다시 managed로 돌리기 위해 merge()를 써야 맞는데, 일부러 persist()를 써 보았더니 try 블럭을 써서 에러는 나지 않는데, set한 결과는 DB에 반영 안되었음을 확인했습니다. (try 블럭 제거하니 ConstraintViolationException 발생함을 확인했습니다.)
// detach()로 detached된 entity를 merge()로 영속화해야 하는데, 이 지점에 persist()를 써 버러면 우짜 되노?
// 참고: DB에는 id=3L : '유관순'으로 저장되어 있음.
Member memberHit = em.find(Member.class, 3L);
System.out.println("0. memberHit.getName() = " + memberHit.getName());
memberHit.setName("곽재우");
System.out.println("1. memberHit.getName() = " + memberHit.getName());
em.detach(memberHit);
System.out.println("2. memberHit.getName() = " + memberHit.getName());
em.persist(memberHit); // merge()를 써야 영속성 entity(managed)가 되는데, 일부러 persist()를 써 봄.
System.out.println("3. memberHit.getName() = " + memberHit.getName());
출력:
Hibernate:
select
member0_.id as id1_0_0_,
member0_.addr as addr2_0_0_,
member0_.name as name3_0_0_
from
Member member0_
where
member0_.id=?
0. memberHit.getName() = 유관순
1. memberHit.getName() = 곽재우
2. memberHit.getName() = 곽재우
3. memberHit.getName() = 곽재우
Hibernate:
/* insert hellojpa.Member
*/ insert
into
Member
(addr, name, id)
values
(?, ?, ?)