簡體   English   中英

Hibernate,OneToOne單個外鍵引用

[英]Hibernate, OneToOne single foreign key references

我的數據庫技能有點生銹,所以學習Hibernate有點困難。

簡而言之,我一直在閱讀一對一,一對多,多對多的內容,這是我從青年時代就了解的內容:

一對一:-表A鏈接到表B中的另一行,並且表A中的行數必須等於表B中的行數。

一對多:-每個公司可以有很多員工。

多對多:-許多醫生可以擁有/共享各種患者。 (無雙關語)。

假設我有以下表格,用於委托方客戶模型

表人:

[id [pk],全名(字符),年齡(int),地址(字符),sendFlowers(布爾值),country_id [fk],whenDead_id [fk]]

1,'Martin Jensen',91,'Notlucky Street 4',false,2,1

2,'Killer Klaus',67,'Die-Hard Strasse 9',真實,1,2

2,'Bingo Man',46,'Secret Address',true,1,2

表:國家

[id [pk],名稱(字符)]


1,“德國”

2,“朝鮮”

表:WhenDead


[id [pk],actionToTake(char)]

1,“忽略/不可能取件”

2,“創建/模仿親屬並領取保險”

在正常情況下,如果需要這些表中的某些信息,則只需使用普通SQL對兩個外鍵進行聯接。 (fx說明,而不僅僅是ID)。 每個人只能連接到一個國家和一個WhenDead表,但是,為了避免重復,多個人當然應該能夠引用相同的外鍵值。

我試圖在Hibernate中使用@OneToOne批注,並將這兩個表的列名用作Entity上的外鍵ID。 它起作用了,但是似乎與OneToOne的含義背道而馳……“一個表中的每一行在另一張表中都有對應的行”和“行數必須在兩個表中都匹配”。

使用一對多或多對多似乎是不自然的。

有人可以將我推向正確的方向嗎?還是我應該繼續講OneToOne,每個印度的冬眠教程都說“除非有很大的設計缺陷,否則從不使用”

您弄錯了,卻忘記了一種關聯:ManyToOne。

讓我們舉個例子:

  • 從A到B的OneToOne:A具有0或一個B,並且B不能與多個As關聯。 因此,兩個表中的行數不必相同。 示例:一輛汽車有一個單板號(如果尚未售出,則為0)。 OneToOne確實非常罕見,我很難找到一個例子。

  • OneToMany:一個A具有0、1或幾個B。 示例:一家公司有很多員工。

  • ManyToOne:A具有0或一個B,並且B可以與多個As關聯。 例如:一個人有一個父親(一個父親可能有幾個孩子)。

  • ManyToMany:A具有0、1或幾個B,並且B可以與0,一個或多個As關聯。 典型示例:一個學生有很多課程,然后是幾名學生。

因此,對於表/實體,您具有以下關聯:

  • 人-多對一-國家
  • 人-多對一-死亡時

確實,有幾個人住在同一個國家,但一個人住在0或1個國家。 有幾個人可能希望被火化(不確定英語是否正確),但是一個人既不能被火化又不能被埋葬。

當然,您可以選擇使這些關聯成為雙向的,或者甚至僅在另一個方向上實現它們。 在這種情況下,

  • 國家-一對多-人
  • WhenDead-一對多-人

簡而言之,每當您從一個表到另一個表都具有外鍵時,就會具有ManyToOne或OneToOne關聯。 如果您可以對外鍵施加唯一約束,那就是一個OneToOne,因為可以保證第一個表的兩行不能引用目標表的同一行。 否則,它是ManyToOne。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM