문제집 생성 관련 캡스톤 프로젝트 중에 문제의 해설을 등록하는 부분이 존재하여 문제 해설을 Commentary, 문제를 Question으로 작성하였습니다.
원래는 1대 1 맵핑을 생각하고 연관관계를 설정하였지만 테스트 코드를 작성하며 생각해본 결과 @Embedded를 사용하여 value type으로 관리하는 게 더 효율적일 것이라고 판단하여 코드를 수정하여 프로젝트를 실행해보았는데 다음과 같은 오류가 발생하였습니다.
Caused by: org.hibernate.MappingException:
Repeated column in mapping for entity: core.backend.question.domain.Question column:
content (should be mapped with insert="false" update="false")
위의 오류 메시지를 확인해보면 "반복적인 column이 Quesiton에 있고, 해당 column은 content이다."라고 상세하게 오류 사항을 알려주었습니다. 따라서 오류 확인을 위해 Commentary와 Quesiton을 코드를 확인해본 결과 오류 메시지에서 알려준 대로 content 항목이 두 곳에 존재하는 것을 알 수 있었습니다. 다음은 Commentary의 코드입니다.
public class Commentary {
private String content;
@Builder
public Commentary(String content) {
this.content = content;
}
}
다음은 Question의 코드입니다.
public class Question extends BaseTimeEntity {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String title;
@Column(nullable = false)
private String content;
@Embedded
private Commentary commentary;
}
@Embedded는 문제의 해설, 음식점의 주소 등 같은 값 객체들을 편리하게 관리할 수 있도록 도와주는 것으로 같은 테이블에 값이 저장됩니다. 결과적으로 다른 클래스에 값이 정의되지만 같은 테이블에 값이 저장되므로 중복된 column이 존재하면 안됩니다.
Question에 모두 선언하였다면 컴파일 오류가 발생했겠지만 1대1 연관관계에서 @Embedded로 코드를 수정하는 과정에서 원래 선언되어있던 column들을 고려하지 않고 가져와서 발생한 오류였습니다.
'🔓 영구 노트' 카테고리의 다른 글
sealed 클래스를 사용하여 else 분기 처리 없애기 (0) | 2022.10.10 |
---|---|
공변성, 무공변성, 반공변성 in kotlin (2) | 2022.10.04 |
if문 중첩 시 간결하게 보이는 법 (0) | 2022.07.06 |
Completed 406 NOT_ACCEPTABLE (0) | 2022.05.27 |
org.hibernate.TransientPropertyValueException (0) | 2022.05.23 |
댓글