2011-09-06 79 views
1

我有一個簡單的對象關係,我希望堅持使用hibernate。休眠,父母/小孩混淆

基本上,它的父母包含一個孩子的集合。我想要做的就是加載父項,否則創建它,向它添加元素並保存它。

這是在GWT環境中完成的,因此我將ChildDTO傳遞給此方法,該方法基本上只是Child類的非持久性版本(與gwts RPC序列化不兼容)。

public Integer testHibernate(Integer parentId, ChildDTO[] test) { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 

    Parent model; 
    if(parentId == null) { 
     // if the parentId is null, create new instance 
     model = new Parent); 
    } 
    else { 
     model = (Parent) hib.load(Parent.class, dto.getId()); 
    } 

    model.setName("dummy name"); 

    for(int i = 0; i < test.length) { 
     model.addChild(new Child(test[i].getId(), test[i].getName())); 
    } 

    hib.save(model);   
    hib.getTransaction().commit(); 

    return model.getId(); 
} 

對,這適用於創建新的父母,沒有孩子。如果我只是將一個孩子添加到現有父級,它也可以正常工作。但是,如果我添加了多個孩子,我從休眠狀態中收到「無法插入」錯誤。

此外,如果我嘗試添加一個孩子,已添加一個孩子的已有父母。我得到一個「具有相同標識符值的不同對象已經與會話相關聯」錯誤。

其他問題。當只插入一個孩子時,在一個空父母上,休眠會執行以下操作:

Hibernate: insert into Child(ChildId, ChildName) values (default, ?) 
Hibernate: update Parent set ChildId=? where ChildId=? 

更新內容如何? :S

+1

請提供堆棧跟蹤。另外,顯示父/子關係的來源,顯示如何設置一對多關係。我的猜測是One-To-Many在數據庫或對象中設置不正確。 –

+0

您可以顯示Parent和Child的hibernate映射嗎?同時顯示父類具體是什麼addChild做的。 –

回答

2

但是,如果我添加了一個以上的孩子,我得到一個「無法插入」 從休眠錯誤。

從問題似乎的父子關係一直設置爲一到一個,而不是一個一對多。首先確保你的休眠配置文件是正確的。

<set name="children"> 
    <key column="parent_id"/> 
    <one-to-many class="Child"/> 
</set> 

另外,如果我嘗試添加只有一個孩子,一個已經存在的父, 其中已經有一個孩子加入。我得到一個「與 不同的對象,相同的標識符值已經與會話」 錯誤「相關聯。

在下面的代碼片段中,您只需使用Id保存子項而不檢查它是否已經存在。請記住,Child也作爲一行存儲在數據庫中。所以你需要檢查數據庫中是否存在該對象。

for(int i = 0; i < test.length) { 
     model.addChild(new Child(test[i].getId(), test[i].getName())); 
    } 

當插入只是一個孩子,一個空的父,Hibernate並在 如下:

這是合乎邏輯的,第一INSERT語句爲新行的Child目的。第二個UPDATE聲明對應於建立ParentChild對象之間的鏈接。

您可以通過設置inverse關係來優化此設置。在這種情況下,Child表存儲parent_id,因此會導致一個INSERT語句比兩個語句。

<set name="children" inverse="true"> 
    <key column="parent_id"/> 
    <one-to-many class="Child"/> 
</set> 

參考Hibernate文檔在這個環節上清楚地解釋瞭如何設置和實施Parent-Child關係:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/example-parentchild.html#example-parentchild-bidir

+0

你是明星先生。 for循環有點令人尷尬,我想有一個例子是我無法找到森林,因爲我看不到所有的樹木:P(我的意思是,我已經爲父母處理了這個問題,不知道爲什麼我認爲這對兒童是需要的)。你在哪裏關於錯誤的關係,我使用OneToMany和JoinColumn標註映射,但我使用的是childId,所以我認爲它試圖更新Children表的主鍵。非常感謝!如果可以,我會給你兩個加號:D – JustDanyul