2016-01-14 36 views
0

我用@OneToOne註釋了我的字段,當我檢查數據庫(使用liquibase生成)時,發現數據庫列上存在唯一的約束。@OneToOne是否意味着唯一性?

這是否意味着@OneToOne僅僅意味着唯一性,例如。一座建築物只能在一個城市中,而其他建築物不能在同一個城市中?

當我想告訴在同一城市可能有其他建築物時,我該怎麼辦?

  • 加@JoinColumn(唯一= FALSE),
  • 只使用@JoinColumn(唯一= FALSE)沒有@OneToOne,
  • 或使用@ManyToOne?
  • 還是不加任何註釋?

我不想在城市類中放置Buildings字段,因爲我永遠不會打電話給city.getBuildings();.以下任何一項是否需要雙向參考?

class Building { 
    @OneToOne(optional = false) 
    City city; 
} 

class Building { 
    @OneToOne(optional = false) 
    @JoinColumn(unique = false) 
    City city; 
} 

class Building { 
    @JoinColumn(unique = true) 
    City city; 
} 

class Building { 
    @ManyToOne 
    City city; 
} 
+0

單向@ManyToOne應該工作得很好。 –

回答

1

JPA specification說,用於雙向OneToOne關係(2.10.1雙向OneToOne關係):

假設:

  • 實體A引用實體的單個實例B.
  • 實體B引用實體A的單個實例。
  • 實體A被指定爲關係的所有者。

以下映射缺省應用:

  • 實體A映射到一個名爲A.表
  • 實體B映射到一個名爲B.表
  • 表A中包含一個外鍵到表B. 外鍵列具有與表B的主鍵相同的類型,並且其上有一個唯一鍵約束

在單向OneToOne關係(2.10.3.1單向OneToOne關係)的情況下:

以下映射缺省應用:

  • 實體A被映射到一個表名爲A.
  • 實體B被映射到名爲B的表。
  • 表A包含表B的外鍵。[...]外鍵列的類型與表B的主鍵類型相同,並且其上有一個唯一鍵約束

如果你有一個城市建設的關係,那麼任何合理的城市將是一個一對多/多對一的關係,因爲一個特定的城市可以有多個建築物,而是一個給定的建築只能在一個城市。

+0

比寫@OneToOne @JoinColumn(unique = false)顯然是錯誤的? – Reek

+1

是的,這是一個矛盾 –