Java 在hibernate中处理一对多关系

Java 在hibernate中处理一对多关系,java,hibernate,jakarta-ee,Java,Hibernate,Jakarta Ee,我还在学习hibernate可以做什么,这次我尝试了一些似乎不起作用的东西。 我有两个表用户和联系人。您可以猜,联系人通过将用户id作为外键来保持关系。下面是两个映射文件的片段。 第一个来自users.hbm.xml <set name="contactsdetails"> <key column="userId"/> <one-to-many class="Domain.Contacts"/> </set> 这个来自contacts

我还在学习hibernate可以做什么,这次我尝试了一些似乎不起作用的东西。 我有两个表用户和联系人。您可以猜,联系人通过将用户id作为外键来保持关系。下面是两个映射文件的片段。 第一个来自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插入到users表中,我希望同时插入到users和contacts中。
这意味着我创建了我的用户对象并为各种属性赋值,在保存用户对象之前,创建一个或一个联系人数组,并将各种属性分配给它,最后将其添加到用户的contactdetails set属性中。当我尝试此操作时,我意识到这有点奇怪,因为contact userId属性属于users类型,所以我会将用户添加到contacts或每个contacts对象中,然后添加在我持久化用户对象之前,将相同的contacts对象添加到用户的contactsdetails属性。我确信我丢失了一些内容,并且在尝试时出现了NullPointerException。您能告诉我如何执行此操作吗?感谢阅读

当实体A指向实体B,实体B指向实体A时,您就得到了hibernate所称的双向映射。这些可能很棘手,你必须小心,还要告诉hibernate,这是一方“拥有”的关系


有关如何管理这些关联的信息,请参见。

当实体A指向实体B,实体B指向实体A时,您就拥有了hibernate所称的双向映射。这些可能很棘手,你必须小心,还要告诉hibernate,这是一方“拥有”的关系


请参阅如何管理这些关联。

您需要告诉Hibernate哪一方“拥有”关系。通常我发现多对一是最简单的。为此,在映射的一侧添加reverse=“true”

<set name="contactsdetails" <!---->inverse="true"<!---->>
  <key column="userId"/>
  <one-to-many class="Domain.Contacts"/>
</set>
非反转侧用于将内存中的表示形式保存到数据库中


您需要告诉Hibernate哪一方“拥有”关系。通常我发现多对一是最简单的。为此,在映射的一侧添加reverse=“true”

<set name="contactsdetails" <!---->inverse="true"<!---->>
  <key column="userId"/>
  <one-to-many class="Domain.Contacts"/>
</set>
非反转侧用于将内存中的表示形式保存到数据库中


是的,我已经阅读了该教程。我使用用户和联系人来说明我的问题。让我们举一个例子,其中有一个消息表和报告表存储收件人号码或电子邮件和消息状态。这种情况下,关系是一对多的,因为一条消息唯一的消息被发送到多个收件人(如果我错了,请纠正我). 我的案例与此类似。感谢阅读是的,我已经阅读了该教程。我使用用户和联系人来说明我的问题。让我们以一个案例为例,其中有一个消息表和报告表存储收件人号码或电子邮件和消息状态。这种情况下,关系是一对多的,因为发送的是一条唯一的消息给多个收件人(如果我错了,请纠正我)。我的案子和那个差不多。谢谢你的阅读