我还在学习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。你能告诉我该怎么做吗?感谢您的阅读
答案 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
非反面用于将内存中表示保存到数据库中。