[JPA] reopository.save()의 insert, update 구분

Jiisuniui·2024년 1월 9일
0

JPA의 모든 것

목록 보기
8/8
post-thumbnail

구분

save(S) 메소드는 엔티티에 식별자(ID) 값이 없으면(null이면) 새로운 엔티티로 판단해서 EntityManager.persist를 호출하고 식별자 값이 있으면 이미 있는 엔티티로 판단해서 EntityManager.merge()를 호출한다.

  • 테이블에 지정한 식별자(ID) 값이 없는 경우(null) - insert 쿼리 실행
  • 테이블에 지정한 식별자(ID) 값이 이미 존재하는 경우 - select 쿼리 후 update 쿼리 실행
  • 테이블에 지정한 식별자(ID) 값이 이미 존재하지만 데이터의 변경이 없는 경우 - select 쿼리 후, update 쿼리 실행 안함

주의점

새로운 테이블을 insert 할 때, 내가 식별자를 지정해서 save 하려고 한다면?

  • save 호출 시점에 새로운 엔티티가 아니므로 merge를 호출

id값을 직접 설정하고 insert를 실행하려면?

  • @Id만 쓰는 엔티티는 Persistable 인터페이스를 구현해서 isNew()를 오버라이딩 함으로써 판단 로직을 상황에 맞게 변경
  • Persistable

참고자료

profile
why error?

0개의 댓글