[java] 혼란 : JPA 및 최대 절전 모드의 @NotNull 대 @Column (nullable = false)

  1. 그들이의 필드 / getter에 나타날 때 @Entity, 그들 사이의 차이점은 무엇입니까? (나는 최대 절전 모드를 통해 엔티티를 유지합니다 ).

  2. 각각의 프레임 워크 및 / 또는 사양은 무엇입니까?

  3. @NotNull안에 javax.validation.constraints있습니다. 에서 javax.validation.constraints.NotNull의 javadoc가 말한다

    주석이 달린 요소는 null이 아니어야합니다.

    그러나 데이터베이스의 요소 표현에 대해서는 이야기하지 않으므로 nullable=false열에 제약 조건 을 추가하는 이유는 무엇입니까?



답변

@NotNullA는 JSR 303 콩 검증 주석은. 데이터베이스 제약 조건 자체와는 아무런 관련이 없습니다. 그러나 Hibernate는 JSR 303의 참조 구현이므로 이러한 제약 조건을 지능적으로 선택하여 데이터베이스 제약 조건으로 변환하므로 하나의 가격으로 두 가지를 얻을 수 있습니다. @Column(nullable = false)열이 널이 아닌 것으로 선언하는 JPA 방식입니다. 즉, 전자는 유효성 검사를위한 것이고 후자는 데이터베이스 스키마 세부 사항을 나타내는 것입니다. 유효성 검사 주석에 대한 Hibernate의 도움을 받고 있습니다.


답변

최신 버전의 최대 절전 모드 JPA 제공자는 @NotNull기본적으로 DDL 과 같은 Bean 유효성 검증 제한 조건 (JSR 303)을 적용합니다 ( hibernate.validator.apply_to_ddl property기본값은 true). 그러나 다른 JPA 제공 업체가이를 수행하거나 수행 할 수 있다는 보장은 없습니다.

@NotNullJVM에서 Java Bean을 유효성 검증 할 때 Bean 특성이 널 (NULL)이 아닌 값으로 설정되도록 Bean 유효성 검증 어노테이션을 사용해야합니다 (데이터베이스 제한 조건과는 관련이 없지만 대부분의 경우 해당 특성과 일치해야 함).

또한 JPA 어노테이션을 사용하여 @Column(nullable = false)원하는 데이터베이스 제한 조건으로 테이블 컬럼을 작성하기위한 올바른 DDL을 생성하기위한 jpa 제공자 힌트를 제공해야합니다. Bean 유효성 검증 제한 조건을 기본적으로 DDL에 적용하는 Hibernate와 같은 JPA 제공자를 사용할 수 있거나 사용하려는 경우이를 생략 할 수 있습니다.


답변

흥미롭게도 모든 출처는 @Column (nullable = false)이 DDL 생성에만 사용된다고 강조합니다.

그러나 @NotNull 주석이없고 hibernate.check_nullability 옵션이 true로 설정된 경우에도 Hibernate는 유지할 엔티티의 유효성을 검사합니다.

nullable = false 속성에 값이없는 경우 데이터베이스 계층에서 이러한 제한이 구현되지 않은 경우에도 “널 (NULL)이 아닌 특성이 널 또는 임시 값을 참조 함”이라는 PropertyValueException이 발생합니다.

hibernate.check_nullability 옵션에 대한 자세한 정보는 http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#configurations-mapping에서 확인할 수 있습니다 .


답변

JPA @Column주석

주석 의 nullable속성 @Column에는 두 가지 목적이 있습니다.

  • 스키마 생성 도구에서 사용됩니다.
  • 지속성 컨텍스트를 플러시하는 동안 최대 절전 모드에서 사용됩니다.

스키마 생성 도구

HBM2DDL 스키마 생성 도구 는 명령문을 생성 할 때 @Column(nullable = false)엔티티 속성을 NOT NULL연관된 테이블 열의 제한 조건으로 변환합니다 CREATE TABLE.

Hibernate User Guide 에서 설명했듯이 데이터베이스 스키마 생성을 위해 HBM2DDL 메커니즘에 의존하는 대신 Flyway 와 같은 도구를 사용하는 것이 좋습니다 .

지속성 컨텍스트 플러시

지속성 컨텍스트를 플러시 할 때 Hibernate ORM은 또한 @Column(nullable = false)엔티티 속성을 사용 합니다 :

new Nullability( session ).checkNullability( values, persister, true );

유효성 검사가 실패하면 Hibernate PropertyValueException는를 던지고 INSERT 또는 UPDATE 문이 불필요하게 실행되는 것을 방지합니다.

if ( !nullability[i] && value == null ) {
    //check basic level one nullablilty
    throw new PropertyValueException(
            "not-null property references a null or transient value",
            persister.getEntityName(),
            persister.getPropertyNames()[i]
        );
}

최대 절전 모드 플러시 메커니즘의 작동 방식에 대한 자세한 내용은 이 문서를 확인 하십시오 .

빈 검증 @NotNull주석

@NotNull주석이 최대 절전 모드 ORM 가장 인기있는 JPA 구현 한 것처럼, 콩 검증에 의해 정의되고, 가장 인기있는 콩 검증 구현은이다 최대 절전 모드 검사기 프레임 워크.

Hibernate ORM과 함께 Hibernate Validator를 사용할 때, Hibernate Validator는 ConstraintViolation엔티티를 확인할 때 를 던질 것이다 .


답변