2009-07-17 94 views
1

我仍在學習Hibernate能做些什麼,這次我嘗試了一些看起來沒有工作的東西。 我有2個表用戶和contacts.as你可以猜測聯繫人通過將user_id作爲外鍵保持關係。這裏是2個映射文件的片段。 這首先是從users.hbm.xml在休眠狀態下使用一對多關係

<set name="contactsdetails"> 
    <key column="userId"/> 
    <one-to-many class="Domain.Contacts"/> 
</set> 

和而每一件事情是工作我的意思是在結構中,映射文件側和插入到這一個是從contacts.hbm.xml

<many-to-one class="Domain.Users" name="userId"/> 

UsersDAO的用戶表,我想插入同一用戶和聯繫人。 含義我創建我的用戶對象,併爲各種屬性賦值,創建一個或一組聯繫人,併爲其分配各種屬性,並最終將其添加到用戶的contactdetails set屬性,然後保存用戶objects.when我試過這個我意識到這有點奇怪,因爲聯繫人userId屬性是用戶類型,因此我會將用戶添加到聯繫人或每個聯繫人對象,然後在我堅持用戶對象之前將相同的聯繫人對象添加到用戶的contactsdetails屬性。我確信我錯過了一些東西,當我嘗試時,我有nullpointerexcpetion。請給我看看如何去做?感謝您的閱讀

回答

1

當你有實體A指向實體B,實體B指向實體A時,你有什麼hibernate調用雙向映射。這些可能會很棘手,你必須小心,並且還要告訴休眠一方「擁有」這種關係。關於如何管理這些關聯,請參閱the Bidirectional associations section of the hibernate docs

+0

是的,我讀過tutorial.i使用用戶和聯繫人來說明我的問題。例如,有一個消息表和報告表,用於存儲收件人號碼或電子郵件和消息status.that案例這種關係是一對多的,因爲單個消息唯一的消息被髮送給多個收件人(糾正我,如果我錯了)。我的情況與此類似。感謝閱讀 – 2009-07-17 15:35:14

0

你需要告訴Hibernate哪一方「擁有」這種關係。通常我發現多對一的一面是最簡單的。爲此,將inverse =「true」添加到映射的一側。

<set name="contactsdetails" <!---->inverse="true"<!---->> 
    <key column="userId"/> 
    <one-to-many class="Domain.Contacts"/> 
</set> 

從文檔:

只發到關聯的反向端的更改不會持久。這意味着Hibernate在每個雙向關聯的內存中有兩個表示:從A到B的一個鏈接和從B到A的另一個鏈接。如果考慮Java對象模型以及多對多關係在Javais創建:

category.getItems().add(item);   // The category now "knows" about the relationship 
item.getCategories().add(category);  // The item now "knows" about the relationship 

session.persist(item);     // The relationship won't be saved! 
session.persist(category);    // The relationship will be saved 

的非反向端用於將內存中表示保存到數據庫中。