OneToMany 매핑 시 mappedBy 옵션 사용하여야하는 이유

xlwdn·2022년 11월 29일
0

문제 발생


Notice.kt

class Notice {
	...

	@OneToMany
  var languageUsage: MutableList<LanguageUsage> = ArrayList()
		protected set

	...
}

LanguageUsage.kt

//TimeEntity는 JPA Auditing 기능임.
class LanguageUsage: TimeEntity(), Persistable<String>, Serializable {
		...
		@Id
    @ManyToOne
    @JoinColumn(name = "language_id", nullable = false)
    val language: Language = language

    @Id
    @ManyToOne
    @JoinColumn(name = "notice_id", nullable = false)
    val notice: Notice = notice
		...
}

(Language는 칼럼 1개(name)만 PK로써 존재합니다. )

정상적이라면 language, language_usage, notice 테이블만 존재하여야하지만 language_language_usage 테이블까지 포함하여 총 4개가 자동 생성되었습니다.

문제 원인


language, language_usage, notice 엔터티의 경우, 테이블 어노테이션을 통해 직접 지정해주었기에 올바른 형태이지만, language_language_usage 테이블은 language_usage 테이블과 달리 오직 noticePk, languagePk밖에 존재하지 않습니다. (language_usage는 TimeEntity를 상속받은 M:N관계 해소 테이블이기에 created_at, updated_at 칼럼이 존재합니다.)

때문에 테이블의 이름, 칼럼 내용 모두 수상한 language_language_usage는 JPA가 자동으로 생성한 테이블임을 알 수 있습니다.

문제 해결


아래와 같이 mappedBy 옵션 지정 시 잘못 생성되는 테이블이 생성되지 않습니다.

Notice.kt

class Notice {
	...

	@OneToMany(mappedBy = "notice")
  var languageUsage: MutableList<LanguageUsage> = ArrayList()
		protected set

	...
}

0개의 댓글