@Enumerated(EnumType.STRING)
|
EnumType.ORDINAL : enum 순서 값을 DB에 저장
EnumType.STRING : enum 이름을 DB에 저장
|
변경 감지와 병합(merge)
변경 감지 기능 사용
@Transactional
void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티
Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티를 조회한 다.
findItem.setPrice(itemParam.getPrice());
//데이터를 수정한다.
}
먼저, find를 통해 해당 Id를 가진 데이터를 조회하고, 파라미터로 넘어온 준영속 상태의 엔티티를 넣어준다.
그렇게 되면 따로 save를 하지 않아도, @Transaction이 끝날 때 commit되고, 그 값이 변경됐다는걸 감지해서 flush 된다.
병합: 기존에 있는 엔티티
병합 동작 방식

1. merge()를실행한다.
2. 파라미터로 넘어온 준영속 엔티티의 식별자 값으로 1차 캐시에서 엔티티를 조회한다.
2-1. 만약 1차 캐시에 엔티티가 없으면 데이터베이스에서 엔티티를 조회하고, 1차 캐시에 저장한다.
3. 조회한 영속 엔티티( mergeMember )에 member 엔티티의 값을 채워 넣는다. (member 엔티티의 모든 값 을 mergeMember에 밀어 넣는다. 이때 mergeMember의 “회원1”이라는 이름이 “회원명변경”으로 바뀐다.
4. 영속 상태인 mergeMember를 반환한다.
병합시 동작 방식을 간단히 정리
- 준영속 엔티티의 식별자 값으로 영속 엔티티를 조회한다.
- 영속 엔티티의 값을 준영속 엔티티의 값으로 모두 교체한다.(병합한다.)
- 트랜잭션 커밋 시점에 변경 감지 기능이 동작해서 데이터베이스에 UPDATE SQL이 실행
'SpringBoot' 카테고리의 다른 글
| [week8] (0) | 2022.02.13 |
|---|---|
| [week1] 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 섹션1-4. (0) | 2021.12.26 |