728x90
반응형
병합 : merge()
merge() 메소드는 준영속 상태의 엔티티를 받아서 그 정보로 새로운 영속 상태의 엔티티를 반환한다.
public class ExamMergemain {
static EntityManagerFactory emf =
Persistence.createEntitymanagerFactory("jpabook");
public static void main(String args[]) {
Member member = createMember("memberA", "회원1");
member.setUsername("회원명변경");
mergeMember(member);
}
static Member createMember(String id, String username) {
//==영속성 컨텍스트 시작==//
EntityManager em1 = emf.createEntityManager();
EntityTransaction tx1 = em1.getTransaction();
tx1.begin();
Member member = new Member();
member.setId(id);
member.setUsername(username);
em1.persist(member);
tx1.commit();
em1.close(); //영속성 컨텍스트 종료
//member 엔티티는 준영속 상태가 된다.
//==영속성 컨텍스트 종료==//
return member;
}
static void mergeMember(Member member) {
//==영속성 컨텍스트2 시작==//
EntityManager em2 = emf.createEntityManager();
EntityTransaction tx2 = em2.getTransaction();
tx2.begin();
Member mergeMember = em2.merge(member);
tx2.commit();
//준영속 상태
System.out.println("member = "+member.getUsername());
//영속 상태
System.out.println("mergeMember = "+mergeMember.getUsername());
System.out.println("em2 contains member = "+em2.contains(member));
System.out.println("em2 contains mergeMember = "+em2.contains(mergeMember));
em2.close()
//==영속성 컨텍스트2 종료==//
}
}
|
cs |
- 출력결과는 다음과 같다.
member = 회원명변경
mergeMember = 회원명변경
em2 contains member = false
em2 contains mergeMember = true
1. merge() 를 실행한다.
2. 파라미터로 넘어온 준영속 엔티티의 식별자 값으로 1차 캐시에서 엔티티를 조회한다.
2-1. 만약 1차 캐시에 엔티티가 없으면 데이터베이스에서 엔티티를 조회하고 1차 캐시에 저장한다.
3. 조회한 영속 엔티티(mergeMember)에 member 엔티티의 값을 채워 넣는다.
4. mergeMember를 반환한다.
비영속 병합
병합은 비영속 엔티티도 영속 상태로 만들 수 있다.
병합은 파라미터로 넘어온 엔티티의 식별자 값으로 영속성 컨텍스트를 조회하고 없다면 데이터베이스에서 조회한다.
데이터베이스에도 없다면 새로운 엔티티를 생성해서 병합한다.
728x90
반응형
'스프링' 카테고리의 다른 글
[JPA] 영속성 관리[4] (1) | 2024.12.09 |
---|---|
[JPA] 영속성 관리[3] (1) | 2024.11.27 |
[JPA] 영속성 관리[2] (0) | 2024.11.26 |
[JPA] 영속성 관리[1] (0) | 2024.11.25 |
[Spring Boot] 동적 쿼리 처리를 위해 Querydsl 알아보기 (0) | 2023.02.13 |