[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)