Hibernate:具有两个不同的 ManyToOne 关系的子表

Posted

技术标签:

【中文标题】Hibernate:具有两个不同的 ManyToOne 关系的子表【英文标题】:Hibernate: Child table having two different ManyToOne relationships 【发布时间】:2013-02-05 12:48:37 【问题描述】:

在我正在编写的 Spring/Hibernate/Java/Tomcat 应用程序中,组织与其联系人之间存在 OneToMany 关系。

组织 1:M 联系人(具有外键 org_id)

在组织中我有这个字段:

@OneToMany(mappedBy="organization")
private List<Contact> contacts;

在联系人中我有这个字段:

@ManyToOne
@JoinColumn(name="org_id")
private Organization organization;

到目前为止一切正常。现在我添加了一个提议的概念。要约可以由组织提出,并且您与该特定要约的指定联系人交谈。

Offer 具有其组织 (org_id) 和指定联系人 (contact_id) 的外键。

到目前为止,报价如下所示:

@OneToOne
@JoinColumn(...)
private Organization offering_org;

@OneToOne
@JoinColumn(...)
private Contact offering_contact;

我的问题的重点来了。我已经注释了用于组织的联系人类。如果我尝试以通常的 Hibernate 方式持久化 Offer 对象,我需要将 Organization 对象和 Contact 对象的副本存储到 Offer 对象中。这似乎与我现有的Organization 冲突:两个Java 类的联系使用。例如,如果我有一个 1:1 的 Offer,如果我把它放到 Contact 类中,我是可以选择使用其中之一还是强制同时使用两者?

既然 Offer 是另一种关系,我是否需要编写 Contact 的数据传输对象版本以用于 Offer 关系?

谢谢, 杰罗姆。

【问题讨论】:

【参考方案1】:

也许我不完全理解这个问题,但我会做这样的事情:

// contact & organization being already persisted entity objects
Offer offer = new Offer();
offer.setOffering_org(organization);
offer.setOffering_contact(contact);

// Persisting the new Offer object to the database, 
// implicitly making the relations.
service.saveObject(offer);

我认为没有理由创建组织对象的副本? 恰好Organization 对象中的“联系人”集合也可以是一个或多个Offer 对象中的Contact

【讨论】:

感谢您的回复。我在我的“已回答问题”中回答了您的回复(请参阅页面上的其他地方)。【参考方案2】:

我认为我最初的问题有点愚蠢。我所做的尝试是将它放在 Offer.java 中:

@Column(name="org_id")
private Long orgId = null;

@Column(name="contact_id")
private Long contactId = null;

我手动填写 orgId,因为报价始终与用户的组织相关联。它是网页中的隐藏字段。

我在网页中放置了一个填充了适当联系人对象(contact.id、contact.name)的 SELECT。

提交网页时,Offer 的 orgId 和 contactId 字段将填写在 @ModelAttribute 参数中。这带我去我想去的地方。

为了解决 mspringer 先生的问题,如果我愿意在我的 Offer 对象中使用组织或联系人列表,您的示例可能会起作用(您说明了“创建新”情况)。这也是我最初问题的主题。但既然我发现我真的不想玩 Offer 中的扩展对象,我也不想玩,所以我可以避开我最初问题的主题。

感谢所有困惑地看着我的练习的人。

【讨论】:

感谢您的回复。我在下面的“已回答问题”中回答了您的回复。

以上是关于Hibernate:具有两个不同的 ManyToOne 关系的子表的主要内容,如果未能解决你的问题,请参考以下文章

休眠错误:org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联

Hibernate:如何让两个集合字段指向相同的对象

在 Hibernate 中映射 2 个具有相同结构的表

org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联

Struts / hibernate NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联

使用带有 Hibernate 的 Spring data jpa 的具有相同标识符的不同对象