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

时间:2013-02-05 12:48:37

标签: spring hibernate many-to-one hibernate-onetomany

在我写的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的概念。要约可以由组织提出,并且您与该特定要约的指定联系人交谈。

Offer为其组织(org_id)和指定联系人(contact_id)提供外键。

到目前为止,优惠看起来像是:

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

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

以下是我的问题。我已经注释了Contact类以便与Organization一起使用。如果我尝试以通常的Hibernate方式保持Offer对象,我将需要将Organization对象和Contact对象的副本存储到Offer对象中。这似乎与我现有的组织冲突:联系使用两个Java类。例如,如果我使用Offer 1:1,如果我将它放入Contact类,我是否可以选择使用或同时使用两者?

由于Offer是另一种关系,我是否需要编写Contact的数据传输对象版本才能在Offer关系中使用?

谢谢, 杰罗姆。

2 个答案:

答案 0 :(得分:0)

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

// 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);

我认为没有理由创建组织对象的副本?
恰好是组织对象中的“联系人”集合也可以是一个或多个商品对象中的联系人。 / p>

答案 1 :(得分:0)

我认为我原来的问题有点愚蠢。我尝试的是把它放在Offer.java中:

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

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

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

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

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

为了解决mspringer先生的意见,如果我愿意在我的Offer对象中使用组织或联系人列表,那么您的示例可以起作用(您说明了“创建新的”情况)。这也是我原来问题的主题。但是,既然我发现我并不真的想要使用Offer中的扩展对象,也不希望这样,我可以避免我原来问题的主题。

感谢所有看到我的运动困惑的人。