save()메서드 ..
-> 새로운 엔티티인 경우 : persist
-> 기존의 엔티티인 경우 : merge
우리는 merge를 사용하여 update를 시키면 안됨.. 반드시 변경감지를 사용해야한다.
merge를 사용하게 된다면 뜻하지 않은 곳에 null이나 빈 값으로 엎어쳐질 수 있기 때문인데..
보통의 경우라면 ~Repository.save()를 해줄 때 PK가있는 id요소에 @GeneratedValue가 있다.
하지만 @GeneratedValue를 안쓰고 직접 ID를 주입시켜줄 때면 어떻게 될까?
=> JPA는 새로운 엔티티라고 인식하지 못하여 merge를 해버린다.
그렇다면 우린 어떻게 방법을 취해야하지 ..?
즉 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 최고..