인프런 커뮤니티 질문&답변

초보무한님의 프로필 이미지
초보무한

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

스프링 데이터 JPA

JPA @id string 사용시 save 문의

작성

·

1.6K

0

안녕하세요

JPA 강의 잘 듣고 있습니다.

. 문의 내용

Users 모델의 Repository 에서 @Id 가 사용자 ID (String)인 경우 save 할때 알아서 insert / update 목적

. 코드

[Users.java]

@Entity
@SuperBuilder
@Getter @Setter
@NoArgsConstructor
public class Users extends JpaBaseEntity{
    @Id
    @Column(name = "userid", unique = true)
    private String id;
    private String name;
    private String departmentName;

    @JsonIgnore
    private LocalDateTime lastLogin;
    @JsonIgnore
    private String ip;
    @JsonIgnore
    @Enumerated(EnumType.STRING)
    private Authority authority;

    @Override
    public String getId(){
        return id;
    }
}

[JpaBaseEntity.java]

@Getter
@MappedSuperclass @SuperBuilder
@NoArgsConstructor @AllArgsConstructor
public abstract class JpaBaseEntity implements Persistable<String> {
    @Column(updatable = false)
    protected LocalDateTime createdDateTime;

    protected LocalDateTime updatedDateTime;

    @Transient
    protected boolean isCreatedMode;

    @Override
    public boolean isNew() {
        return isCreatedMode;
    }

    @PrePersist
    private void prePersist() {
        createdDateTime = LocalDateTime.now();
    }

    @PreUpdate
    private void preUpdate() {
        updatedDateTime = LocalDateTime.now();
    }
}

String 형태의 Id 를 사용할 경우 JPA 내부에서 알아서 신규건(insert)인지 기존건(update)인지 확인하기 위해서 extends 를 위한 객체만들었습니다.

위와 같이 한 후 save 하는데, 원하는 결과가 아니고 동일 값을 insert 시도를 해서 에러가 발생하네요 ㅠ

. 콘솔 에러

ERROR 42980 --- [nio-9999-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : Unique index or primary key violation: "PUBLIC.PRIMARY_KEY_4 ON PUBLIC.USERS(USERID) VALUES ( /* 1 */ '아이디' )"; SQL statement:

급한 마음에 '스프링 데이터 JPA' 까지 수강 이전 순수 JPA 로만 구현하고 있어 모르는 부분이 많습니다.

답변 부탁드리겠습니다 (문의 전 관련 키워드 검색해봐도 없어서 문의 남깁니다)

답변 1

1

안녕하세요. 초보무한님, 공식 서포터즈 David입니다.

우선, 질문 주신 내용은 강의에서 다루지 않는 내용입니다. 따라서, 관련된 질문 글들이 없었을 것으로 생각됩니다.

새로운 엔티티냐 아니냐는 isNew()를 통해 판단될텐데, isCreatedMode만 나와있네요.

엔티티를 저장하실 때 isNew() 내 isCreatedMode 값이 정상적으로 사용되는지 디버깅을 통해 확인해보시겠어요?

감사합니다.

초보무한님의 프로필 이미지
초보무한
질문자

답변 감사합니다.

isNew 함수 내에서 String id 의 검색여부가 반환하기 위한 방법은 어떻게 수정하면 될까요?

isCreatedMode 값이 아닌 함수 내에서 ID 값을 리턴하면 될까요?

아래 글을 참고해주세요.

https://jaime-note.tistory.com/65

초보무한님의 프로필 이미지
초보무한

작성한 질문수

질문하기