@Entity
のフィールド/ゲッターに表示される場合、それらの違いは何ですか? (エンティティをHibernateで永続化します)。
それぞれがどのフレームワークや仕様に属しますか?
@NotNull
はjavax.validation.constraints
内にあります。 javax.validation.constraints.NotNull
javadocでは
注釈付き要素はnullであってはなりません
しかし、データベース内の要素の表現については話していないので、なぜ列に制約nullable=false
を追加するのですか?
@NotNull
は JSR 303 Bean Validation アノテーションです。データベースの制約自体とは関係ありません。ただし、HibernateはJSR 303のリファレンス実装であるため、これらの制約をインテリジェントに取得し、データベースの制約に変換するため、1つの価格で2つを取得できます。 @Column(nullable = false)
は、列が非ヌルであることを宣言するJPAの方法です。つまり前者は検証用で、後者はデータベーススキーマの詳細を示すためのものです。検証アノテーションについて、Hibernateから追加の(そして歓迎します!)ヘルプを受け取っています。
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プロバイダーに依存できる場合、または依存したい場合は、それらを省略できます。
興味深いことに、すべてのソースは、@ 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 で入手できます。