Kotlin/Spring

(Spring) 복합키 설정 시 entitynotfoundexception unable to find with id 0 애러 해결

너어디사니 2024. 5. 31. 00:38

로직 구성

  • 부모 Entity가 생성이 되는 로직에서 자식 Entity가 동시에 생성이 되는 로직
  • 여기서 자식 Entity는 3개의 복합키를 가지고 있는 Entity이다
// 부모
... 이상 생략

starScoreService.giveCommentScore(reviewResult, userResult, result, score)
commentRepository.save(result)

... 이하 생략

// 자식

 @Transactional
    fun giveCommentScore(review: Review, user: User, comment: Comment, starScore:Float){

            val result = StarScore.create(user, review, comment, starScore)
            starScoreRepository.save(result)
    }

 

문제 발생

  • 부모 Entity가 id 값이 0인 Entity를 찾는 문제가 발생
    • StarScoreId라는 아이디 생성 클래스를 사용하고 있기 때문에 0을 조회 할 수 있다고 판단 하여 우선 다음 문제를 보기 위해서 아래와 같이 작업하고 다음 애러를 찾았다
@IdClass(StarScoreId::class)
@Entity
@Table(name = "star_score")
class StarScore(

    @Id
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="user_id", nullable = false)
    val user: User,

    @Id
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="review_id", nullable = false)
    val review: Review,

    @Id
    @OneToOne(fetch = FetchType.LAZY)
    @NotFound(action = NotFoundAction.IGNORE) // NotFound Annotation으로 오류 무시
    @JoinColumn(name="comment_id", nullable = false)
    val comment: Comment,

    @Column(name = "score", nullable = false)
    var score: Float,

    )
  • attempted to assign id from null one-to-one property 애러 발생
    • 해당 애러는 1:1 맵핑 관계에서 부모 Entity가 자꾸 ID에 null을 참조하려는 문제이다
    • 근본 적인 원인은 comment Entity 가 생성 되는 과정에서 star_score entity가 동시에 생성이 되는데 이 때 부모 entity의 생성 사항이 자식 entity까지 영향이 가면서 발생한 현상이라는 것을 확인했다
    • 따라서 @OneToOne Annotation에 cascode 타입을 Merge로 변경하여 부모 생성 후에 자식이 생성 할 경우 바로 병합 할 수 있게끔 조치했다
 @Id
    @OneToOne(fetch = FetchType.LAZY, cascade = [CascadeType.MERGE])
    @JoinColumn(name="comment_id", nullable = false)
    val comment: Comment,

 

  • 이 후 정상 작동 실행 확인했다

 

  • 결론
    • 1:1 맵핑 관계에서는 부모 Entity와 자식 Entity간의 종속 관계를 잘 설정해야 한다