2011-11-25 219 views
14

我在JPA 2.0 FR規範11.1.37中碰到了這個例子。 OneToOne註解,403頁:@OneToOne(可選= 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。但是,實際的連接列不能設置爲非空,因爲共享該表的其他子類無法插入!

在實踐中,不同提供者的不同版本可能會或可能不會在任何時候解釋任何一個,但是要注意空洞。

+4

非常感謝這樣明確的答案! –

相關問題