save()메서드 주의점 !

타마타마·2022년 9월 7일
0

JPA

목록 보기
9/10

save()메서드 ..
-> 새로운 엔티티인 경우 : persist
-> 기존의 엔티티인 경우 : merge

우리는 merge를 사용하여 update를 시키면 안됨.. 반드시 변경감지를 사용해야한다.
merge를 사용하게 된다면 뜻하지 않은 곳에 null이나 빈 값으로 엎어쳐질 수 있기 때문인데..

보통의 경우라면 ~Repository.save()를 해줄 때 PK가있는 id요소에 @GeneratedValue가 있다.

하지만 @GeneratedValue를 안쓰고 직접 ID를 주입시켜줄 때면 어떻게 될까?
=> JPA는 새로운 엔티티라고 인식하지 못하여 merge를 해버린다.

그렇다면 우린 어떻게 방법을 취해야하지 ..?

  1. 해당 엔티티에 Persistable<id타입> 받기 ( Persistable은 인터페이스 )
  2. getter 생성
  3. @createdDate생성
  4. isNew()메서드를 오버라이드하여 createdDate에 null을 줌으로써 새 엔티티라고 명시해주기

createdDate를 생성하여 강제 null을 주입함으로써 새 엔티티라고 명시하여 persist()동작하게 만들것

예시이다.


@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EntityListeners(AuditingEntityListener.class)
public class Item implements Persistable<String> {

    //@Id @GeneratedValue
    //private Long id;

    @Id
    private String id;
    

    @CreatedDate
    private LocalDate createdDate;


    public Item(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }

    @Override
    public boolean isNew(){
        return createdDate == null;
    }
}

이걸 직접 구현하게 한다면 ,, 아으 끔찍해라
JPA 최고..

0개의 댓글