【问题标题】:Hibernate: Child table having two different ManyToOne relationshipsHibernate:具有两个不同的 ManyToOne 关系的子表
【发布时间】: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 关系?

谢谢, 杰罗姆。

【问题讨论】:

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


    【解决方案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 中的扩展对象,我也不想玩,所以我可以避开我最初问题的主题。

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

    【讨论】:

    • 感谢您的回复。我在下面的“已回答问题”中回答了您的回复。
    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 2012-08-15
    • 1970-01-01
    相关资源
    最近更新 更多