[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)
@JoinColumn
은 name
속성 말고도 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)