@Basic (optional = false) vs @Column (nullable = false) in JPA


답변:


98

Gordon Yorke (EclipseLink 아키텍처위원회 위원, TopLink 핵심 기술 책임자, JPA 2.0 전문가 그룹 구성원)는이 주제에 대해 좋은 답변을 썼으므로 그를 의역하는 대신 그의 답변을 인용하겠습니다 .

차이 optionalnullable들이 평가되는 범위이다. ' optional' 의 정의는 속성 및 필드 값에 대해 설명하고이 기능이 런타임 내에서 평가되어야 함을 제안합니다. ' nullable'은 데이터베이스 열에 대한 참조에만 있습니다.

구현이 구현을 선택하면 optional해당 속성은 지속성 공급자에 의해 메모리에서 평가되어야하며 SQL이 데이터베이스로 전송되기 전에 발생하는 예외가 발생합니다. 그렇지 않으면 ' updatable=false' ' optional'를 사용할 때 위반이보고되지 않습니다.


8
그렇다면 실제로 사용해야 할 것은 둘 다일까요?
Xiè Jìléi

39
@Xie Jilei : 책에서 : 최대 절전 모드 2007의 Java 지속성, p. 179 : @Basic(optional = false) @Column(nullable = false)@Basic 주석은 속성을 Java 개체 수준에서 선택 사항이 아닌 것으로 표시합니다. 열 매핑에 대한 두 번째 설정 인 nullable = false는 NOT NULL 데이터베이스 제약 조건의 생성 만 담당합니다. Hibernate JPA 구현은 어떤 경우에도 두 옵션을 동일한 방식으로 처리하므로이 목적을 위해 주석 중 하나만 사용할 수 있습니다.
랩트

2
@rapt-이해가 안 돼 The @Basic annotation marks the property as not optional on the Java object level.그게 무슨 뜻이야? 따라서 해당 변수에 대한 @Basic데이터베이스 열 NOT NULL을 만드는 것과 같습니다 .
Erran Morad 2014 년

9
즉, null 필드가있는 엔티티를 지속하려고하면 optional = false (데이터베이스에 연결하지 않음)로 표시되고 엔티티가 JPA 지속성 컨텍스트에 추가되지 않으면 예외가 발생합니다. nullable = false로만 주석 처리 된 경우 엔티티는 지속성 컨텍스트에 추가되고 엔티티를 데이터베이스에 쓰려고 할 때 (예 : 플러시를 통해)이를 거부하는 데이터베이스에 엔티티를 쓰려고 시도합니다. 그러면 예외가 발생합니다.
Ray Hulha 2015-08-24

@RayHulha "@Basic (optional = false)"로 필드에 주석을 달고 데이터베이스에 튜플을 추가했습니다 (이 필드의 값 = null). 예외가 발생하지 않았습니다 !!, 설명 할 수 있기를 바랍니다. 나에게이 행동.
ziMtyth

4

그래서 JPA 2.1 (EclipseLink)을 사용하여 @Basic (optional = false) 주석을 시도했는데 주석이 실제 사용에서 무시되는 것으로 나타났습니다 (적어도 문자열 필드의 경우). (예 : entityManager.persist 호출).

그래서 나는 사양으로 가서 그것에 대해 읽었습니다. 사양은 다음과 같습니다.
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/

기본 (선택 사항) : 필드 또는 속성의 값이 null 일 수 있는지 여부. 이것은 힌트이며 기본 유형에 대해서는 무시됩니다. 스키마 생성에 사용될 수 있습니다.

그래서이 문장은 스키마 생성에 사용되는 Basic (선택 사항)의 실제 사용 사례를 설명한다고 생각합니다. (즉 : Java Entity 클래스에서 CREATE TABLE SQL을 생성 할 때. 예를 들어 Hibernate가 할 수있는 작업입니다.)


1
다른 답변이 스키마 생성에 사용되는 기본이 아닌 nullable이라는 것을 의미한다는 것은 재밌습니다 (« 'nullable'는 데이터베이스 열을 참조하는 경우에만 있음»). 여전히 매우 혼란 스럽습니다. 스키마 생성에 nullable 사용되고 Basic (optional = false) 동일한 목적으로 사용될 있다고 생각합니까? 말이 돼?
marcus

optional = false런타임에서이 제약 조건을 확인하기위한 것입니다. nullable = false데이터베이스 제약을 생성합니다. 응용 프로그램의 경우 optional = false데이터베이스로 이동하여 제약 조건을 확인하는 것보다 더 빨리 평가되기 때문에 설정 하는 것도 의미가 있습니다.
nimo23
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.