@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_id", nullable = false)
private User user;
JPA를 이용해서 N:1관계를 만들 때 사용되는 @ManyToOne과 @JoinColumn을 사용하면서, 위 코드와 같이 @ManyToOne에도 연관관계가 반드시 존재해야 한다는 조건인 optional = false @JoinColumn도 nullable=false가 있는데 이 둘의 차이점이 무엇인지 궁금증이 생겼다.
/**
* (Optional) Whether the association is optional. If set
* to false then a non-null relationship must always exist.
*/
boolean optional() default true;
optional을 먼저 살펴보면 "연결 관계에 대한 선택 사항이고, 만약 false라면 연결 관계가 null이 될 수 없고 항상 존재해야 한다는 설정이다.
/** (Optional) Whether the foreign key column is nullable. */
boolean nullable() default true;
외래키가 null인지 아닌지에 대한 설정이다.
두 개를 읽어보고 약간 힌트를 얻었지만 구글링을 해보니 정답은 아래와 같았다.
optional=false는 JPA 구현에 대한 런타임 조건이고, nullable=false는 DDL에 대한 조건이다.
그래서 나는 정말 연관관계가 반드시 필요한 관계라면 두 개, 전부 써주는 것이 좋다고 생각하여 아래와 같이 2개 다 사용하였다.
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_id", nullable = false)
private User user;