JPA와 Hibernate의 Persist()와 Merge() 간의 차이점 이해
JPA와 Hibernate에서 persist() 및 merge () 메서드는 엔터티를 관리하고 데이터 지속성을 처리하는 데 중요한 역할을 합니다. 그러나 동작에는 뚜렷한 차이가 있습니다.
Persist()
JPA 사양에 정의된 persist() 메서드는 다음과 같이 작동합니다.
- 엔티티가 새 엔터티이고 관리되지 않는 경우 해당 엔터티는 관리되며 트랜잭션이 커밋되거나 플러시될 때 데이터베이스에 저장됩니다.
- 엔티티가 이미 관리되거나 제거된 경우 작업은 무시됩니다.
- 엔티티가 분리되면 예외가 발생하거나 플러시 또는 커밋 시간 동안 지속 작업이 실패할 수 있습니다.
- 연속 작업은 다음을 사용하여 참조된 모든 엔터티에 적용됩니다. cascade=PERSIST 또는 cascade=ALL 주석.
Merge()
반면, merge() 메서드는 다른 의미 집합을 갖습니다.
- 엔티티가 분리된 경우 해당 상태는 동일한 ID를 가진 기존 관리 엔터티에 복사되거나 새 관리 복사본이 생성됩니다.
- 엔티티가 새로운 경우 , 새 관리 엔터티가 생성되고 해당 상태가 수신 엔터티에서 복사됩니다.
- 엔티티가 제거되면 예외가 발생합니다.
- 엔티티가 관리되면 작업이 무시됩니다. 그러나 cascade=MERGE 또는 cascade=ALL로 주석이 달린 경우 계단식 작업은 참조된 엔터티에 계속 적용됩니다.
- 병합된 엔터티는 cascade=MERGE 또는 cascade=ALL로 주석이 달린 모든 관계에 대해 관리되는 엔터티를 참조합니다.
- 계속 연결되지 않은 관계에 대한 참조와 엔터티가 병합된 경우 병합된 엔터티의 연결은 동일한 ID를 가진 관리 개체에 대한 참조를 반환합니다.
Persist() 또는 Merge() 사용
이러한 차이점을 바탕으로 다음 지침은 적절한 방법을 선택하는 데 도움이 될 수 있습니다.
- 원할 때 persist()를 사용하세요. 아직 지속성 컨텍스트에 의해 관리되지 않는 기존 엔터티를 새로 만들거나 업데이트합니다.
- 이미 관리되지만 지속성 컨텍스트 외부에서 수정된 기존 엔터티를 업데이트하려면 merge()를 사용하세요. .