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:具有相同标识符值的不同对象已与会话关联
org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联
Struts / hibernate NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联