違いは何だ@Basic(optional = false)
と@Column(nullable = false)
JPAの永続性では?
違いは何だ@Basic(optional = false)
と@Column(nullable = false)
JPAの永続性では?
回答:
Gordon Yorke(EclipseLinkアーキテクチャ委員会メンバー、TopLinkコアテクニカルリード、JPA 2.0エキスパートグループメンバー)がこのトピックについて良い答えを書いたので、彼を言い換えるのではなく、彼の答えを引用します。
違い
optional
とは、nullable
それらが評価される範囲です。'optional
' の定義は、プロパティとフィールド値について話し、この機能をランタイム内で評価する必要があることを示唆しています。」nullable
'はデータベース列を参照するためだけのものです。実装を選択したが、実装する場合は
optional
、次にこれらのプロパティは「を使用したときにそれ以外のデータベースに送信される永続プロバイダーとSQLの前に発生した例外によってメモリに評価されなければならないupdatable=false
」「optional
報告することはないだろう」違反を。
@Basic(optional = false) @Column(nullable = false)
@Basicアノテーションは、プロパティをJavaオブジェクトレベルでオプションではないとしてマークします。列マッピングの2番目の設定nullable = falseは、NOT NULLデータベース制約の生成のみを担当します。Hibernate JPA実装は、どちらの場合も両方のオプションを同じ方法で処理するため、この目的のために1つのアノテーションのみを使用することもできます。
The @Basic annotation marks the property as not optional on the Java object level.
それはどういう意味ですか?つまり、上記の変数の@Basic
データベース列NOT NULL
を作成すると言っているだけですか?
そのため、JPA 2.1(EclipseLink)を使用して@Basic(optional = false)アノテーションを試しましたが、実際には(少なくともStringフィールドでは)アノテーションが無視されることがわかりました。(entityManager.persist呼び出しなど)。
それで、仕様に行き、それについて読みました。仕様の内容は次のとおりです。http:
//download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/
基本(オプション):フィールドまたはプロパティの値がnullかどうか。これはヒントであり、プリミティブ型の場合は無視されます。スキーマ生成に使用できます。
したがって、この文は、スキーマ生成で使用される基本(オプション)の実際の使用例を説明していると思います。(つまり、Java EntityクラスからCREATE TABLE SQLを生成する場合。これは、たとえばHibernateが実行できることです。)
optional = false
実行時にこの制約をチェックするためだけのものです。nullable = false
データベース制約を作成します。アプリケーションの場合、設定するoptional = false
なります感覚、それがデータベースに行くよりも早く評価されるため、そこに...その制約をチェック