본문 바로가기
🔓 영구 노트

Embedded 사용 시 MappingException 발생

by 파랭이가 룰루랄라 2022. 4. 27.

문제집 생성 관련 캡스톤 프로젝트 중에 문제의 해설을 등록하는 부분이 존재하여 문제 해설을 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들을 고려하지 않고 가져와서 발생한 오류였습니다.

댓글