JPA 엔티티의 생명주기는 비영속, 영속, 준영속, 삭제의 네 가지 상태로 구분됩니다.

  • 비영속(Transient): 객체를 생성했지만 아직 영속성 컨텍스트가 관리하지 않는 상태입니다.
  • 영속(Managed): persist()로 저장하거나 조회하여 영속성 컨텍스트가 관리하는 상태입니다. 변경 감지와 1차 캐시의 대상이 됩니다.
  • 준영속(Detached): 한때 영속 상태였지만 detach(), clear(), close() 등으로 영속성 컨텍스트의 관리를 벗어난 상태입니다. 값을 변경해도 변경 감지가 동작하지 않습니다.
  • 삭제(Removed): remove()가 호출되어 삭제 대상으로 관리되는 상태입니다. 실제 DELETE SQL은 보통 플러시 시점에 실행됩니다.

merge()를 사용하면 준영속 엔티티의 값을 영속 상태의 엔티티에 복사할 수 있습니다. 이때 인자로 전달한 객체 자체가 다시 영속 상태가 되는 것이 아니라, 별도의 영속 엔티티가 반환된다는 점에 주의해야 합니다.