【问题标题】:Hibernate: many-to-many through additional tableHibernate:通过附加表进行多对多
【发布时间】:2011-11-21 09:36:52
【问题描述】:

我有这些表,组织可以是许多消息的发送者或接收者,一个 msg 可以有 2 个发送或接收的组织。我知道我的数据库没有意义,但我无法更改它:

那么,我是否将 SenderReceiver 连接到 Msg 作为 1-to-n,将 Organization 连接到 SenderReceiver 作为 n-to-1?反之亦然 n-to1 和 1-to-n?

发送者接收者

public class Senderreceiver implements java.io.Serializable {

        private Set<Organization> organizations = new HashSet();
        private Set<Msg> msg = new HashSet();

xml 文件

<set fetch="select" inverse="true" lazy="true" name="msgs" table="MSG">
      <key>
        <column name="MsgID" not-null="true"/>
      </key>
      <one-to-many class="entity3.Msg"/>
    </set>



<set fetch="select" inverse="true" lazy="true" name="organizations"  table="ORGANIZATION">
      <key>
        <column name="OrganizationID" not-null="true"/>
      </key>
      <one-to-many class="entity3.Organization"/>
    </set>

消息

public class Msg implements java.io.Serializable {

        private Senderreceiver senderreceiver;

xml

<many-to-one class="entity3.Senderreceiver" fetch="select" name="senderreceiver">
      <column name="SenderReceiverID" not-null="true"/>
    </many-to-one>

组织

public class Organization implements java.io.Serializable {

        private Senderreceiver senderreceiver;

xml

 <many-to-one class="entity3.Senderreceiver" fetch="select" name="senderreceiver">
          <column name="SenderReceiverID" not-null="true"/>
        </many-to-one>

我们将不胜感激。提前致谢!

【问题讨论】:

    标签: java hibernate orm entity-relationship foreign-key-relationship


    【解决方案1】:

    我建议这样做:

    在我看来,这是 2-N 关系。一个组织可以发送许多消息,而一条消息只能由一个或两个组织发送或接收。您不需要连接表。

    在组织中放置一组消息 - 这将代表组织发送/接收的消息。您也可以制作 2 套 - sentMSGSreceivedMSGS

    并将组织的 FK 放入消息本身,因为这将代表消息的组织。您可以在消息中添加sentIDreceviedID

    我觉得这样会让对表格和程序的理解更加容易。

    如果选择保留原来的关系,多对多关系将呈现为:

    1-N-1 (Organization-SenderReceiver-Msg)。

    Organization-SenderReceiver 是 1-N 而SenderReceiver-Msg 是 N-1。

    因此,您将SenderReceiver 的集合放在OrganizationMsg 类中。以及SenderReceiver 内的OrganizationMsg 的对象。

    【讨论】:

    • 感谢您的回答!你看,我根本无法更改数据库。有人告诉我,组织消息是多对多的。 1-N-1 是否反映了这一点?
    • 是的,让organization-SenderReceiver 1-N 和SenderReceiver-Msg N-1。
    【解决方案2】:

    SenderReceiver 表有一个指向组织的外键和一个指向消息的外键。这清楚地表明一个 SenderReceiver 可能只有一个消息和一个组织。

    你因此拥有

    • Organization 和 SenderReceiver 之间的 OneToMany,
    • SenderReceiver 和组织之间的多对一,
    • Message 和 SenderReceiver 之间的 OneToMany
    • SenderReceiver 和 Message 之间的 ManyToOne

    是否映射所有这些关联取决于您。每个关联可能是单向的或双向的。

    【讨论】:

    • 感谢您的回答!从逻辑上讲,我需要组织和消息之间的多对多。我如何映射所有这些东西?
    • 不,你不这样做,因为那时你无法映射 SenderReceiver 表中的 Role 列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    相关资源
    最近更新 更多