daliy
@JoinColumn(nullable) & @OneToOne(optional)
narafu
2023. 1. 25. 17:03
@JoinColumn(nullable = false, name = "notify_id")
@OneToOne(fetch = FetchType.LAZY, optional = false)
lateinit var notify: NotifyEntity
JPA의 앤티티 셋팅을 하다가 특이한 점을 발견하였다.
1대1의 관계를 갖고 있고, FK를 필수로 갖게 하기 위해,
@JoinColumn의 nullable 옵션을 false로 설정하였다.
그런데 @OneToOne의 옵션 중 optional 이란 특성을 알게 되었다.
일단 각각의 설명은 다음과 같다.
@JoinColumn의 "nullable = false"에 대한 설명이다.
@JoinColumn의 "nullable = false"
(Optional) Whether the foreign key column is nullable.
@OneToOne의 "optional = false"에 대한 설명이다.
@OneToOne의 "optional = false"(Optional) Whether the association is optional. If set to false then a non-null relationship must always exist.
둘의 기능은 얼핏 같아보이지만, 실제 테스트해보니 DB 셋팅이 다르게 적용된다.
@JoinColumn의 "nullable = false"로 설정하면, 단지 FK를 'not null'로 관리할 뿐이다.
@OneToOne의 "optional = false"로 설정하면, FK를 'unique'하게 관리한다.
@OneToOne의 "optional = false"이 없으면, DB에서는 UK가 없다.
즉 그렇다면 나는 OneToOne으로 앤티티를 만들었지만, DB에서는 insert가 될 것이다.
@OneToOne가 있으니 JPA를 통해서 insert가 되는 것은 막아줄까?
어떻게 될까?
JPA를 통해 insert가 되었다.
즉, @OneToOne은 의미가 없는 샘아다.
결론,
1대1의 관계로, FK를 'unique'하게 관리해야 한다면,
@OneToOne만으로는 안되고, "optional = false"로 설정해야 한다.