@JoinColumn 관련 이슈 정리

PPakSSam·2022년 1월 11일
0

목차


PK가 아닌 필드를 참조하는 FK를 만들 때


오류 상황

[School]

@Entity
public class School implements Serializable {
	
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name="school_id", nullable = false, unique = true)
    private Long schoolId;   
    
    @OneToMany(mappedBy = "school")
    private Set<Solved> solvedSet = new HashSet<>();
    ...
    
}

[Solved]

@Entity
public class Solved {
	
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @ManyToOne
    @JoinColumn(name = "school_id")
    private School school;
    ...
    
}
  • @JoinColumn(name = "school_id") -> school_id를 참조할 것이라 예상
  • 실제로는 school_id가 아닌 id를 참조하는 table을 만듦

테스트를 돌리면 table을 생성하는 과정에서 다음과 같은 쿼리를 확인할 수 있었다.

Hibernate: alter table solved add constraint FK3d1skgq7xw652uvo5mi5sbd26
foreign key (school_id) references school (id)

왜 오류가 발생하였는가

@JoinColumnname속성 말고도 referencedColumnName이라는 속성이 있다.
referencedColumnName이란 FK가 조인할 대상 테이블의 컬럼명을 지정하는 것이다.
referencedColumnName을 명시하지 않으면 기본값으로 PK를 참조하게 되어있다.
따라서 school_id가 아니라 PK인 School의 id를 참조하게 된 것이다.

해결

@Entity
public class Solved {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "school_id", referencedColumnName = "school_id")
    private School school;
    
    ...

}

테스트를 돌려보니 의도했던대로 잘 작동함을 알 수 있다.

Hibernate: alter table solved add constraint FK3d1skgq7xw652uvo5mi5sbd26
foreign key (school_id) references school (school_id)

참고

profile
성장에 대한 경험을 공유하고픈 자발적 경험주의자

0개의 댓글