JPAでの@Basic(オプション= false)と@Column(nullable = false)


回答:


98

Gordon Yorke(EclipseLinkアーキテクチャ委員会メンバー、TopLinkコアテクニカルリード、JPA 2.0エキスパートグループメンバー)がこのトピックについて良い答えを書いたので、彼を言い換えるのではなく、彼の答えを引用します

違いoptionalとは、 nullableそれらが評価される範囲です。' optional' の定義は、プロパティとフィールド値について話し、この機能をランタイム内で評価する必要があることを示唆しています。」nullable 'はデータベース列を参照するためだけのものです。

実装を選択したが、実装する場合はoptional、次にこれらのプロパティは「を使用したときにそれ以外のデータベースに送信される永続プロバイダーとSQLの前に発生した例外によってメモリに評価されなければならないupdatable=false」「optional報告することはないだろう」違反を。


8
それで、どちらを使用する必要がありますか?
謝Jìléi

39
@Xie Jilei:本から:hibernate 2007でのJava永続化、p。179:@Basic(optional = false) @Column(nullable = false)@Basicアノテーションは、プロパティをJavaオブジェクトレベルでオプションではないとしてマークします。列マッピングの2番目の設定nullable = falseは、NOT NULLデータベース制約の生成のみを担当します。Hibernate JPA実装は、どちらの場合も両方のオプションを同じ方法で処理するため、この目的のために1つのアノテーションのみを使用することもできます。
2011年

2
@rapt-わかりませんThe @Basic annotation marks the property as not optional on the Java object level.それはどういう意味ですか?つまり、上記の変数の@Basicデータベース列NOT NULLを作成すると言っているだけですか?
Erran Morad 2014

9
つまり、nullフィールドを持つエンティティを永続化しようとすると、optional = falseとマークされている場合(データベースに接続せずに)例外がスローされ、エンティティはJPA永続コンテキストに追加されません。nullable = falseとのみ注釈が付けられている場合、エンティティは永続化コンテキストに追加され、エンティティをデータベースに(たとえば、フラッシュを介して)書き込もうとすると、データベースにエンティティを書き込もうとしますが、これは拒否され、その場合、例外がスローされます。
Ray Hulha 2015

@RayHulha「@Basic(optional = false)」でフィールドに注釈を付けようとし、データベースにタプルを追加しました(このフィールドの値= nullで)、例外は発生しませんでした!!私にこの行動。
ziMtyth 2017

4

そのため、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が実行できることです。)


1
奇妙なことに、スキーマの生成に使用されるBasicではなく、null可能であることを他の回答が示唆しているのは面白いことです(「「null可能」はデータベース列のみを参照する」と表示されている場合)。それはまだ非常に混乱しています。nullable スキーマ生成に使用され、Basic(オプション= false)同じ目的で使用されると思いますか?それは理にかなっていますか?
マーカス

optional = false実行時にこの制約をチェックするためだけのものです。nullable = falseデータベース制約を作成します。アプリケーションの場合、設定するoptional = falseなります感覚、それがデータベースに行くよりも早く評価されるため、そこに...その制約をチェック
nimo23
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.