class Notice {
...
@OneToMany
var languageUsage: MutableList<LanguageUsage> = ArrayList()
protected set
...
}
//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 옵션 지정 시 잘못 생성되는 테이블이 생성되지 않습니다.
class Notice {
...
@OneToMany(mappedBy = "notice")
var languageUsage: MutableList<LanguageUsage> = ArrayList()
protected set
...
}