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간의 종속 관계를 잘 설정해야 한다