차이 무엇 @Basic(optional = false)
과 @Column(nullable = false)
JPA의 지속성은?
차이 무엇 @Basic(optional = false)
과 @Column(nullable = false)
JPA의 지속성은?
답변:
Gordon Yorke (EclipseLink 아키텍처위원회 위원, TopLink 핵심 기술 책임자, JPA 2.0 전문가 그룹 구성원)는이 주제에 대해 좋은 답변을 썼으므로 그를 의역하는 대신 그의 답변을 인용하겠습니다 .
차이
optional
와nullable
들이 평가되는 범위이다. 'optional
' 의 정의는 속성 및 필드 값에 대해 설명하고이 기능이 런타임 내에서 평가되어야 함을 제안합니다. 'nullable
'은 데이터베이스 열에 대한 참조에만 있습니다.구현이 구현을 선택하면
optional
해당 속성은 지속성 공급자에 의해 메모리에서 평가되어야하며 SQL이 데이터베이스로 전송되기 전에 발생하는 예외가 발생합니다. 그렇지 않으면 'updatable=false
' 'optional
'를 사용할 때 위반이보고되지 않습니다.
@Basic(optional = false) @Column(nullable = false)
@Basic 주석은 속성을 Java 개체 수준에서 선택 사항이 아닌 것으로 표시합니다. 열 매핑에 대한 두 번째 설정 인 nullable = false는 NOT NULL 데이터베이스 제약 조건의 생성 만 담당합니다. Hibernate JPA 구현은 어떤 경우에도 두 옵션을 동일한 방식으로 처리하므로이 목적을 위해 주석 중 하나만 사용할 수 있습니다.
The @Basic annotation marks the property as not optional on the Java object level.
그게 무슨 뜻이야? 따라서 해당 변수에 대한 @Basic
데이터베이스 열 NOT NULL
을 만드는 것과 같습니다 .
그래서 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가 할 수있는 작업입니다.)
optional = false
런타임에서이 제약 조건을 확인하기위한 것입니다. nullable = false
데이터베이스 제약을 생성합니다. 응용 프로그램의 경우 optional = false
데이터베이스로 이동하여 제약 조건을 확인하는 것보다 더 빨리 평가되기 때문에 설정 하는 것도 의미가 있습니다.