스프링

[JPA] 영속성 관리[5]

zumsim 2024. 12. 10. 21:34
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를 반환한다.

 

비영속 병합

 

병합은 비영속 엔티티도 영속 상태로 만들 수 있다.

Member member = new Member();
Member newMember = em.merge(member); //비영속 병합
tx.commit();
cs

 

 

정리

병합은 파라미터로 넘어온 엔티티의 식별자 값으로 영속성 컨텍스트를 조회하고 없다면 데이터베이스에서 조회한다.

데이터베이스에도 없다면 새로운 엔티티를 생성해서 병합한다.

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