web-dev-qa-db-ja.com

なぜ@Column(nullable = false)を指定する必要があるのですか?

@Entityアノテーションが付けられたエンティティがあります。
CREATE TABLEスクリプトの作成を担当している場合、NOT NULLキーワードを使用してデータベースに列を作成できるのに、なぜ@Column( nullable = false )を指定する必要があるのですか?フィールドでこのプロパティを使用する利点を示す例はありますか?

40
Fagner Brack

特に JSR303 @NotNullアノテーション も追加する場合は、エラーメッセージとエラー処理が改善されます。

列をNOT NULLとして作成したが、JPAにnullではないことを伝えない場合、JPAはnull値がOKであると想定します。 nullを含むオブジェクトを保存しようとすると、オブジェクトがDBに送信され、DBレベルのエラーが発生します。これにより、データベース内のログスパムが増加し、エラーからどのテーブルのどの列が問題であったかを判断するのがはるかに難しくなります。

それらにnull以外のアノテーションを付けると、JPAは保存する前に例外をスローし、DBログスパムを回避し、通常はより良いエラーを提供します。特に、JPAプロバイダーがJSR303をサポートし、nullable=falseを内部で@NotNullに変換するか、@NotNullを追加した場合、正確に確認できるデータ構造が提供されます。カスタマイズ可能なテンプレートエラーメッセージとともに、どのオブジェクトのどのフィールドがどのような理由で拒否されたか。

NOT NULLフィールドについてJPAに伝える必要があるのはそのためです。それに加えて、コードで作業している他の人にとっても、DBスキーマを読む必要なく理解しやすくなります。

52
Craig Ringer

さらに、列にnullable = false in @ManyToOneアノテーション、HibernateはINNER JOIN関連テーブルへのクエリを実行します。 nullable = trueは結果を与えるLEFT JOIN

それは他の違いです。

28

あなたの場合、実際の利点はないかもしれませんが、:

  • jpaプロバイダーを使用してスキーマを生成する場合(mavenまたはhbm2ddl.autoなどの自動生成を介して)、それは重要です
  • エンティティモデルに対してスキーマを検証するようにJPAプロバイダーを構成する場合、それらを同期させる必要があります。
4
Bozho