回答:
@NotNull
あるJSR 303ビーン検証アノテーションでは。データベースの制約自体とは関係ありません。ただし、HibernateはJSR 303のリファレンス実装であるため、これらの制約をインテリジェントに取得してデータベースの制約に変換するため、1つの価格で2つ取得できます。@Column(nullable = false)
カラムがnullでないことを宣言するJPAの方法です。つまり、前者は検証を目的としており、後者はデータベーススキーマの詳細を示すためのものです。検証アノテーションに関して、Hibernateから追加の(そして歓迎の!)支援を得ているだけです。
@NotNull
、@Size
、@Min
、@Max
、など、データベースの制約にそれらを翻訳します。
休止JPAプロバイダの最新バージョンは、のような豆の検証制約(JSR 303)が適用される@NotNull
デフォルト(のおかげでDDLへのhibernate.validator.apply_to_ddl property
デフォルトtrue
)。しかし、他のJPAプロバイダーがそれを行う、またはそれを行う能力さえあるという保証はありません。
@NotNull
JVMでJava Beanを検証するときは、Beanのプロパティがnull以外の値に設定されていることを確認するために、Bean検証アノテーションを使用する必要があります(これはデータベースの制約とは関係ありませんが、ほとんどの場合、それらに対応するはずです)。
さらに、JPA @Column(nullable = false)
プロバイダーを使用して、JPA プロバイダーに、必要なデータベース制約を持つテーブル列を作成するための適切なDDLを生成するためのヒントを与える必要があります。デフォルトで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を参照してください。
@Column
アノテーション注釈のnullable
属性に@Column
は2つの目的があります。
HBM2DDLスキーマ生成ツールは、ステートメントを生成するときに、@Column(nullable = false)
エンティティー属性をNOT NULL
関連するテーブル列の制約に変換しますCREATE TABLE
。
私が説明したようにHibernateユーザーガイド、それは次のようなツールを使用することをお勧めしますフライウェイ代わりに、データベーススキーマを生成するためのHBM2DDLメカニズムに依存するので。
永続コンテキストをフラッシュするとき、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]
);
}
Hibernateフラッシュメカニズムの動作の詳細については、こちらの記事をご覧ください。
@NotNull
アノテーション@NotNull
注釈は、HibernateのORMは、最も人気のJPA実装であると同じように、豆の検証によって定義され、最も人気のある豆の検証の実装があるHibernateバリデータフレームワーク。
Hibernate ValidatorをHibernate ORMと共に使用するとConstraintViolation
、エンティティの検証時にHibernate Validatorがをスローします。