在hibernate中使用一对多关系

时间:2009-07-17 15:11:22

标签: java hibernate java-ee

我还在学习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设置属性。当我尝试这个我意识到它有点奇怪,因为联系人userId属性属于用户类型,因此我将用户添加到联系人或每个联系人对象,然后在我持久化用户对象之前将相同的联系人对象添加到用户的contactsdetails属性。我确定我我错过了一些东西,当我尝试的时候我正在进行nullpointerexcpetion。你能告诉我该怎么做吗?感谢您的阅读

2 个答案:

答案 0 :(得分:1)

如果实体A指向实体B,而实体B指向实体A,则hibernate调用双向映射。这些可能很棘手,你必须小心,并告诉hibernate一方“拥有”这段关系。

有关如何管理这些关联的信息,请参阅the Bidirectional associations section of the hibernate docs

答案 1 :(得分: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
  

非反面用于将内存中表示保存到数据库中。