2011-09-11 63 views
2

我得到了一對一的關係。基本上,在「A類」中,我與「B類」有一對一的關係。這個關係使用主鍵連接列。現在我的問題如下,如果我嘗試創建A的實例,我不能保存它,因爲我還沒有添加B的實例。但是,我不能創建一個B的實例,因爲我需要首先使用A的ID。雞或蛋類休眠映射問題

一個簡單的解決方案是使B中自動生成一個編號,這樣我就能創建A的實例然而之前創建B的情況下,我敢肯定有這樣做的更好的辦法? :)

我可以在冬眠創建了A的ID列一個額外的指數,該指數即時猜測是一個外鍵約束數據庫中看到。我可以看到文檔中的一對一映射的XML版本有一個屬性來指定關係是否受到約束,但是,@OneToOne批註似乎沒有此選項? :S

回答

2

看來你有AB表之間的兩個關係(你有:Aa_idb_id; Bb_ida_id)。模型one to one你只需要一個關係。確定哪個表是「主」再滴從「次要」的表列(應爲:A具有a_idb_id; B具有b_id)。之後,hibernate(和任何其他架構客戶端)將能夠首先插入到B,然後到A參考B表。

例如,對於雞蛋和雞肉。雞蛋和雞之間有多種關係(一隻雞可以產下很多雞蛋,一隻雞可以產一隻雞)。所以對於one to one關係蛋生產雞,它是合理的,有parent_egg_idchicken表,所以雞蛋可以創建第一,然後參照該蛋生雞。

Hibernate映射可能如下所示:

在雞類:

@OneToOne 
@JoinColumn(name = "parent_egg_id") 
public Egg getParentEgg() { 
    return parentEgg; 
} 

蛋類:

@OneToOne(mappedBy = "parentEgg") 
public Chicken getChildChicken() { 
    return childChicken; 
} 

更新:

同樣的事情, constrained在xml中,optional屬性在OneToOne接口會做。它默認爲true,所以這種關係默認是可以空的。

/** 
    * (Optional) Whether the association is optional. If set 
    * to false then a non-null relationship must always exist. 
    */ 
    boolean optional() default true; 

根據你的意見行首先插入A。我會考慮從BA,而不是從AB。在這種情況下,要創建A中的項目,然後在B中需要兩個insert聲明(關係從AB - 需要額外的update A聲明)。

+0

嗨:)非常感謝您的回答,但我沒有A和B. A之間的兩個關係A_ID和B已B_ID。正如我在我的文章中提到的,我實際上能夠首先插入B,獲取id並使用它創建A.我真的只想找出如何使OneToOne屬性可以爲空,所以我可以先創建A B :) – JustDanyul

+0

默認爲空。請參閱答案的更新部分。 – Andrey

+0

再次感謝您的回答,我解決了它。我認爲問題是我正在使用PrimaryKeyJoinColumn,它似乎創建了從A到B的外鍵約束:)非常感謝幫助:) – JustDanyul