web-dev-qa-db-ja.com

混乱:@NotNull vs @Column(nullable = false)

  1. @Entityのフィールド/ゲッターに表示される場合、それらの違いは何ですか? (エンティティをHibernateで永続化します)。

  2. それぞれがどのフレームワークや仕様に属しますか?

  3. @NotNulljavax.validation.constraints内にあります。 javax.validation.constraints.NotNull javadocでは

    注釈付き要素はnullであってはなりません

    しかし、データベース内の要素の表現については話していないので、なぜ列に制約nullable=falseを追加するのですか?

211
rapt

@NotNullJSR 303 Bean Validation アノテーションです。データベースの制約自体とは関係ありません。ただし、HibernateはJSR 303のリファレンス実装であるため、これらの制約をインテリジェントに取得し、データベースの制約に変換するため、1つの価格で2つを取得できます。 @Column(nullable = false) は、列が非ヌルであることを宣言するJPAの方法です。つまり前者は検証用で、後者はデータベーススキーマの詳細を示すためのものです。検証アノテーションについて、Hibernateから追加の(そして歓迎します!)ヘルプを受け取っています。

290
Ryan Stewart

Hibernate JPAプロバイダーの最新バージョンは、デフォルトで@NotNullなどのBean検証制約(JSR 303)をDDLに適用します(hibernate.validator.apply_to_ddl propertyのデフォルトはtrueに感謝します)。しかし、他のJPAプロバイダーがそれを実行できる、または実行できるという保証さえありません。

JVMでJava Beanを検証するときに、Beanプロパティがnull以外の値に設定されるように、@NotNullなどのBean検証アノテーションを使用する必要があります(これは、データベースの制約とは関係ありませんが、ほとんどの場合、それらに対応する必要があります)。

さらに、@Column(nullable = false)のようなJPAアノテーションを使用して、必要なデータベース制約を持つテーブル列を作成するための適切なDDLを生成するヒントをjpaプロバイダーに提供する必要があります。デフォルトでBean検証制約をDDLに適用するHibernateなどのJPAプロバイダーに依存できる場合、または依存したい場合は、それらを省略できます。

12
Sebastian Theek

興味深いことに、すべてのソースは、@ Column(nullable = false)がDDL生成にのみ使用されることを強調しています。

ただし、@ NotNullアノテーションがなく、hibernate.check_nullabilityオプションがtrueに設定されている場合でも、Hibernateは永続化されるエンティティの検証を実行します。

Nullable = false属性に値がない場合、データベース層にそのような制限が実装されていなくても、「not-nullプロパティはnullまたは一時的な値を参照します」と言うPropertyValueExceptionをスローします。

Hibernate.check_nullabilityオプションの詳細については、 http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#configurations-mapping で入手できます。