Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

290570

prepersist (trouble shooting) 본문

java_spring (2024.05 ~ 2024.10)

prepersist (trouble shooting)

qordpsem 2024. 10. 2. 02:00

1. createdat, updatedat 에 쓸 어노테이션 @CreatedDate, @LastModifiedDate 를 알게됨

 

>> 추후 자세히 정리

 

 

2. 어노테이션 붙이려고 보니 createdat, updatedat 사용하는 다른 엔티티들도 많아서 BaseEntity 생성

 

 

3. BaseEntity 생성 후 User entity 에서 createdat, updatedat 코드 제거하고 BaseEntity 상속받게 함

@Getter
@MappedSuperclass
public class BaseEntity {
    @CreatedDate
    @Column(name="createdat", nullable = false, updatable = false)
    private LocalDateTime createdat;

    @LastModifiedDate
    @Column(name="updatedat", nullable = false)
    private LocalDateTime updatedat;
}
public class User extends BaseEntity {

}

 

 

 

4. BaseEntity 상속받고 BaseEntity 에 createdat updatedat 잘 있는데 오류가 남

 

org.hibernate.PropertyValueException: not-null property references a null or transient value : cohttp://m.example.fanmon_be.domain.user.entity.User.createdat

>> createdat 에 null 오류

 

 

public class User {
    @Id
    @Column(name = "useruuid", nullable = false)
    private UUID useruuid;

    @PrePersist
    public void generateUUID(){
        if(useruuid == null){
            useruuid = UUID.randomUUID();
        }
    }

 

uuid 할때 prepersist 써준것처럼 createdat, updatedat 에도 prepersist 필요하다..!

 

(prepersist 에 대해 추후 자세히 추가하기)

 

 

5. createdat, updatedat 도 prepersist  추가

@Getter
@MappedSuperclass
public class BaseEntity {
    @CreatedDate
    @Column(name="createdat", nullable = false, updatable = false)
    private LocalDateTime createdat;

    @LastModifiedDate
    @Column(name="updatedat", nullable = false)
    private LocalDateTime updatedat;

    @PrePersist
    protected void prePersist() {
        LocalDateTime now = LocalDateTime.now();
        createdat = now;
        updatedat = now;
    }

    @PreUpdate
    protected void preUpdate() {
        updatedat = LocalDateTime.now();
    }
}

 

회원 가입 시 회원 생성 잘 됨 !!

 

 

단 ,,예기치 못한 문제 추가됨,,

 

 

실행할때 오류는 안나지만,,

회원 가입은 잘 되지만,,

 generateUUID 에 빨간줄이 생김

 

'PrePersist' entity listener method is already defined in class 'User' or in one of its superclasses 

 

빨간줄에 커서를 대면 이렇게 떴는데

현재 상속중인 BaseEntity 안에도 PrePersist 가 있고, User entity 에도 PrePersist 가 있어서 생긴 문제 같았다

 

 

 

6. 결국 다시 BaseEntity 에서 PrePersist 빼고 (아까 createdat에 null 떴던 그상태로) 코드 원상복귀 시키고

@Getter
@MappedSuperclass
public class BaseEntity {
    @CreatedDate
    @Column(name="createdat", nullable = false, updatable = false)
    protected LocalDateTime createdat;

    @LastModifiedDate
    @Column(name="updatedat", nullable = false)
    protected LocalDateTime updatedat;

}

 

 

 

7. User entity 안에 uuid와 함께 prepersist 선언함

@PrePersist
public void generateUUID(){
    if(useruuid == null){
        useruuid = UUID.randomUUID();
    }
    LocalDateTime now = LocalDateTime.now();
    super.createdat = now;
    super.updatedat = now;
}

 

'java_spring (2024.05 ~ 2024.10)' 카테고리의 다른 글

validation (trouble shooting)  (0) 2024.10.02
Validation 적용  (0) 2024.10.02
코드 리팩토링(builder pattern)  (0) 2024.09.30
spring security 코드 작성  (0) 2024.09.29
spring security  (0) 2024.09.28