728x90
반응형
jpa 준영속 상태
개념
- 영속성 컨텍스트가 더 이상 관리하지 않는 엔티티를 준영속 상태라고 함.
- 즉, database 에 이미 한 번 갔다 온다음, 영속성 콘텍스트에서 빠진 Entity 를 준영속 상태라고 함.
-- 여기서 member 는 이미 1이라는 pk 로 저장돼있다고 가정하고
-- api 를 통해 다시 한 번 들어오면, Member member = new Member() 는 준영속 상태이다.
-- 영속
@PostMapping(xxx)
public xxx updateMember(xxx) {
Member member = new Member();
member.setId(1);
}
준영속 엔티티를 수정하는 방법
1. find 로 찾은 다음에 데이터를 변경해줌 (best 방법)
- 아래와 같이 데이터를 수정하면, 변경 감지를 통해 update 해줌.
@Transactional
public void updateMember(MemberDto xxx) {
Member member = memberRepository.findOne(memberId);
member.setName(xxx);
}
2. merge 호출 및 동작방식
2.1 merge 호출
// merge 호출
em.merge(member);
// merge 상세 동작 - 데이터를 조회해와서 아래와 같이 set 을 한 번씩 더 해줌.
// 즉, 불필요한 set 과정이 한 번 더 들어가는거지.
Member member = memberRepository.findOne(memberId);
member.setName(xxx)
member.setAge(xxx);
2.2 Merge 동작 방식
- em.merge(paramMember) —> 1차 캐시 에서 엔티티 찾음. —> 없으면 DB 조회 함.
- 위에서 찾은 데이터를 dbMember 객체 라고 하면, dbMember 객체에 paramMember 의 값을 전부 set 해줌.
- set 해준다음에 영속성상태인 dbMember 를 반환. paramMember 는 영속성 상태가 아니다.
변경감지 vs merge
- merge 는 필드를 전부 교체해버리기에 주의해서 써야 함.
- 내가 실수로 Member.age 에 null 값을 넣어버리면 이게 그대로 디비에 반영이 되버림.
- 변경감지의 경우 변경할 것만 바꿔주면 나머지는 그대로 값이 들어감.
'Jpa' 카테고리의 다른 글
Jpa One to Many Non primary key 로 연결해서 조회 (0) | 2021.02.05 |
---|---|
jpa 단방향, 양방향 개념 정리 (0) | 2021.01.13 |
JPA ENUMERATED 사용법 정리 (0) | 2020.12.31 |
jpa embedded, cascade 정리 (0) | 2020.12.27 |
jpa 외래키 연관관계 맵핑 주인은 외래키가 존재하는 곳으로 설정 (0) | 2020.12.22 |
댓글