2011-11-25 5 views
14

JPA 2.0 FR仕様11.1.37でこの例にぶつかりました。 OneToOne注釈、ページ403:@OneToOne(optional = false)と@JoinColumn(nullable = false)を一緒に使用

@OneToOne(optional=false) 
@JoinColumn(name="CUSTREC_ID", unique=true, nullable=false, updatable=false) 
public CustomerRecord getCustomerRecord() { return customerRecord; } 

は私が@OneToOne(optional=false)を入れて、その同時に@JoinColumn(... nullable=false)を置くべきどんな理由がありますか?

これらの宣言は同じですか?それらのいずれかが重複していませんか?
両方ともDDLスキーマの生成に使用されていますか?

答えて

26

正式には、optional=falseは、JPA実装の実行時の命令であり、nullable=falseは、DDLジェネレータの命令です。だから彼らは厳密に冗長ではありません。

エンティティの継承が関与している場合、その相違は重要になります。特定のマッピングがサブクラスにのみ存在し、単一のテーブル・テーブル階層戦略を使用する場合、マッピングを含む特定のサブクラスでは、OneToOneマッピングはoptional=falseになる可能性があります。ただし、実際の結合列をnot-nullにすることはできません。これは、表を共有する他のサブクラスを挿入できないためです。

実際には、異なるプロバイダの異なるバージョンでは、いずれかの時点でどちらか一方を解釈する場合もあるし、解釈しない場合もあります。

+4

このような明確な答えには多くの義務があります! –

関連する問題