inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 ORM 표준 JPA 프로그래밍 - 기본편

일대일 [1:1]

일대일 optional 여부에 따른 UNIQUE 제약

528

김태경

작성한 질문수 1

3

안녕하세요! 강의를 너무나 잘 듣고 있습니다.

일대일 강의를 들으면서 이것저것 만져보다가 @OneToOne(optional=true) 인 경우에는 UNIQUE 제약이 걸리지 않고 반대로 false인 경우에는 UNIQUE 제약이 걸리는 것을 알게 되었습니다.

혹시 이렇게 구현된 이유가 무엇인지 알 수 있을까요?

일대일 optional JPA java

답변 1

2

David

안녕하세요. 김태경님, 공식 서포터즈 David입니다.

optional 속성이 false일 경우 연관된 엔티티가 반드시 존재해야 합니다.

일대일 연관관계를 잘 생각해보면 A1 - BB, A2 - CC와 같이 각각 하나의 엔티티만 바라보아야 합니다.

만약 A1 - BB , A2 - BB 와 같이 엔티티가 중복 참조되고 있다면 일대일 관계가 아니게 됩니다.

따라서, false의 경우 연관된 엔티티가 반드시 존재해야 하고, 이때 엔티티가 중복 참조되면 안되므로 유니크 제약조건을 추가하게 되는 것입니다.

일대일 관계를 키워드로 검색하셔서 학습하시면 좋을 것 같습니다:)

감사합니다.

0

김태경

늦은 시간에 친절한 답변 감사합니다.

그럼 혹시 optional = true인 경우에는 어째서 UNIQUE 제약을 걸지 않는 걸까요? 말씀해주신 일대일 관계의 조건을 optional=true인 경우에도 지키도록 해야할텐데요.

0

David

optional 속성이 true라면 연관된 엔티티가 존재하지 않아도 됩니다. 그 반대인 false 값은 연관된 엔티티가 반드시 존재해야 합니다.

그렇다면 연관된 엔티티가 존재하지 않는 경우 null이 들어가게 될텐데, 유니크 제약조건의 경우 null 도 열(column)당 하나만 올 수 있습니다. (MSSQL 문서 참고) 이런 부분 때문에 optional이 true일 때 유니크 제약조건을 걸지 않도록 하는 것 같습니다.

0

김태경

MySQL의 경우 컬럼에 유니크 제약이 걸려있어도 다수의 null 값을 허용합니다.. (공식 docs)

그리고 이는 DBMS에 따라서 선택 가능한 선택적 기능입니다. 따라서 모든 DBMS가 그렇다고는 할 수 없네요. JPA가 nullable 선택지를 제공하면서 UNIQUE 제약 적용 방식을 범용성 있게 설계하기 위하여 이렇게 구현한 것인가 생각이 들긴 합니다.

덕분에 깊게 생각해 볼 수 있었습니다. 답변 감사합니다.

0

David

MySQL의 경우 다수의 null 값을 허용하는군요. 저는 MSSQL 문서를 참고했습니다.

유니크 제약조건에 의해 NULL도 하나만 들어오게 한다면 아래 문서에 나타난 케이스의 경우 대응할 방법이 마땅치 않아 보이네요. 말씀하신 부분에 공감합니다. 저도 하나 더 배우고 갑니다:)

https://zetawiki.com/wiki/UNIQUE_%EC%A1%B0%EA%B1%B4%EA%B3%BC_NULL_%ED%97%88%EC%9A%A9_%EC%A1%B0%EA%B1%B4%EC%9D%98_%EC%96%91%EB%A6%BD

inheritance startegy 선택시 고려사항

0

18

1

Entity 동등성 비교

0

17

1

실무 조언 관련 질문입니다.

0

44

1

H2데이터베이스 파일 생성

0

55

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

52

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

51

1

JPQL 메소드와 락

0

55

1

Delivery @OneToOne

0

60

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

91

2

UnsupportedOperationException 발생

0

85

3

H2 Database 연결이 안됩니다.

0

92

2

연관관계 매핑 질문드립니다.

0

84

2

h2데이터베이스 실행오류

0

107

2

persistence.xml

0

106

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

79

1

영속성 컨텍스트

0

64

1

JPA 프록시

0

93

1

Native Query와 MyBatis

0

65

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

85

1

임베디드 타입 예시 코드 관련 질문

0

114

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

93

3

인텔리제이 패키지 커서 단축키 질문

0

108

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

142

1

양방향 연관관계 시 연관관계 주인을 설정하는 이유

0

70

1