[콘솔 에러 메시지]
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "
alter table bet
add constraint FK7i47jpjlmnmjf89vsd8humfw1
foreign key (member_id)
references member (member_id)" via JDBC [Key column 'member_id' doesn't exist in table]
at ...
"bet" 테이블을 생성하는데 외래키인 member_id를 찾을 수 없다는 것이다.
위 에러 메시지는 일부분만 발췌한 것이다.
전체 에러 메시지는 Member 테이블의 기본키인 "member_id" 뿐만 아니라, Bet 테이블이 외래키로 참조하는 모든 키에 대해 찾을 수 없다는 내용의 메시지를 포함하고 있었다.
오류가 발생한 문제의 원인은 다음 2가지로 유추하였다.
1. 엔티티의 잘못된 연관관계 매핑
2. DB의 구조적 오류
[Bet Entity 구성]
/**
* 배팅
* (Member : Bet = 1 : N)
* (Event : Bet = 1 : N)
* (BettingOption : Bet = 1 : N)
*/
@Entity
@Getter
@NoArgsConstructor
public class Bet extends BaseEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "bet_id")
private Long id;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "member_id", nullable = false)
private Member member;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "event_id", nullable = false)
private Event event; //소속 Event
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "betting_option_id", nullable = false)
private BettingOption bettingOption; //배팅 옵션
private Long amount; //배팅 포인트
//생성 일자(배팅 일자)
}
Member, Event, BettingOption 엔티티도 반대로 @OneToMany로 올바르게 매핑되어 있었다.
이를 보았을때, "1. 엔티티의 잘못된 연관관계 매핑"이 오류의 원인은 아니다.
그렇다면, "2. DB의 구조적 오류"가 원인인가?
jpa:
hibernate:
ddl-auto: create
프로젝트를 실행하면 모든 테이블을 DROP후 CREATE 하는 전략을 채택하고 있어서 외래키를 왜 참조하지 못하는지 이해하지 못하였다.
MySQL DB의 "Bet" 테이블의 구조를 살펴보았더니, 기본키인 "id" 만 존재하고 나머지 컬럼은 존재하지 않았다.
에러 메시지에 명시된 것처럼 외래키가 모두 컬럼으로 생성되지 못하였다.
[해결 방안]
@JoinColumn의 nullable 속성을 조정해보고, ID 생성 전략인 @GeneratedValue의 strategy 속성을 조정해보았지만, 아무런 소득이 없었다.
"MySQL의 스키마 자체를 삭제 후 재생성하고, 프로젝트를 실행"하였다.
에러 없이 Bet 테이블이 모든 컬럼을 가지고 있는 것을 확인할 수 있다.