-
[JPA] Primary Key가 아닌 필드를 참조하는 Foreign Key 를 만들때개발 2021. 12. 12. 17:27
Primary Key가 아닌 필드를 참조하는 Foreign Key 를 만들때
@JoinColumn(referencedColumnName = [참조하는 필드 이름])
1:N 단방향 관계 오류 상황
Stock 이라는 테이블과 DailyStock 이라는 데이터 필드의 일대다(1:N) 매칭 시 일어난 문제이다.
Price 는 Stock 의
tickerSymbol
이라는 필드를 참조하고 있다.Price
@Entity public class Price { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "price_id") private Long priceId; @ManyToOne @JoinColumn(name = "ticker_symbol") private Stock stock;
Stock
@Entity public class Stock implements Serializable { @Id @Column(name = "stock_id") private Long id; @Column(name = "ticker_symbol", unique = true, nullable = false) private String tickerSymbol;
처음에는 당연히
@JoinColumn(name="ticker_symbol")
이라고 했으니, Stock 의tickerSymbol
항목을 참조할 거라고 생각하는데, 실제로 쿼리를 날리는 것을 관찰해보니stock_id
를 참조하고 있더라.해결
이를 해결하기 위해서는
@JoinColumn
의referencedColumnName
의 값으로 참조하길 원하는 필드 이름을 넣어주면 된다.@Entity(name = "price") public class Price { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "price_id") private Long priceId; @ManyToOne @JoinColumn(name = "ticker_symbol", referencedColumnName = "ticker_symbol") private Stock stock;
혹은 Price 테이블에 외래키로 TickerSymbol 을 넣어주면 잘 작동한다.
그러나 부득이한 경우 테이블 외래키를 설정하기 힘든 경우에는 첫번째 방법을 애용하도록 하자.'개발' 카테고리의 다른 글
[JPA] bulk data batch 작업 시 유의점 (0) 2022.01.06 [CI] Jenkins 와 Github Webhook 으로 PR 유효성 체크하기 (0) 2021.12.29 [TDD] TDD 로 알고리즘 문제 풀어보기 - 프로그래머스 42626, 더 맵게 (2) 2021.10.31 [Spring Boot] Logging 과 @slf4j 에 대해서 (0) 2021.10.29 [Web] Web Server 와 WAS (0) 2021.10.28