Quizeloper 엔티티 추가 수정사항이 있어 수정하고 다시 빌드했더니 다음과 같은 에러가 발생했다.

 

오류 내용

Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Collection 'com.cs.quizeloper.quiz.entity.Quiz.quizUnitList' is 'mappedBy' a property named 'quiz_id' which does not exist in the target entity 'com.cs.quizeloper.quiz.entity.QuizUnitList'

 

프로젝트 실행할 때 자동으로 해당 class의 이름을 가진 DB 테이블을 생성하기 위해 JPA(Hibernate)를 사용했다.

이 에러는 entityManagerFactory가 빈 생성 중에 오류가 발생한 것으로, 어떤 컬렉션 필드가 문제가 있는 것으로 보인다.
해당 컬렉션은 'mappedBy' 속성이 사용되었는데, 이 속성의 값인 'id'라는 이름의 속성이 연관된 엔티티 클래스에 존재하지 않는다는 뜻이다.

 

 

발생 원인

문제의 엔티티는 Quiz, QuizUnit으로 Quiz-[One-Many]-QuizUnitList의 관계이다.

Quiz 엔티티는 퀴즈 테이블, QuizUnitList 엔티티는 퀴즈 문제 유형들을 담는 엔티티이다.

테이블 연관관계 매핑시 @OneToMany 어노테이션에 mappedBy 속성을 추가하였다.

 

QuizUnitList 엔티티
Quiz 엔티티

 

QuizUnitList 엔티티에서 Quiz 엔티티를 참조할 때 작성한 필드명은 quiz인데 mappedBy 속성에 잘못하고 quiz_id로 잘못입력해 오류가 발생하였다.

 

 

해결 방법

수정 후 Quiz 엔티티

quiz_id에서 quiz로 고쳐주니 오류없이 잘 실행되었다! 

 

 

 

정리 내용

  • DB에서는 FK를 통해 맺는 연관관계를 객체로 표현할 때는 연관관계 주인과 mappedBy로 나타내야 한다.
  • 다대일 관계에서 다가 되는 쪽이 연관관계 주인이 된다.
  • 연관관계 주인이 되는 부분은 Join할 컬럼을 나타내야 한다.
    • @ManyToOne 어노테이션을 통해 연관관계를 나타내고 @JoinColumn(name = "quiz_id")을 통해 어떤 컬럼(필드명)과 조인을 하는지 나타내면 된다.
  • mappedBy는 연관관계를 맺으며 주인이 되는 객체의 필드명을 적어준다.

+ Recent posts