Hibernate:通过附加表实现多对多

时间:2011-11-21 09:36:53

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

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

enter imad description here

那么,我将SenderReceiver连接到Msg为1对n,组织对SenderReceiver为n对1吗?反之亦然n-to1和1-to-n?

Senderreceiver

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>

任何帮助都会被接受。提前谢谢!

2 个答案:

答案 0 :(得分:1)

我会建议:

我认为,这是2-N关系。组织可以发送许多消息,并且只能由一个或两个组织发送或接收消息。你不需要连接表。

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

并将组织的FK放在消息本身中,因为这将重新显示消息的组织。您可以在邮件中添加sentIDreceviedID

我认为这将使表格和程序的理解更加容易。

如果您选择保留原始关系,则多对多关系将显示为:

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

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

因此,您在SenderReceiverOrganization类中添加了Msg的集合。以及Organization中的MsgSenderReceiver对象。

答案 1 :(得分:1)

SenderReceiver表具有组织的外键和Message的外键。这清楚地表明SenderReceiver可能只有一个Message和一个组织。

你有

  • 组织与SenderReceiver之间的OneToMany,
  • SenderReceiver和Organization之间的ManyToOne,
  • Message和SenderReceiver之间的OneToMany
  • SenderReceiver与Message之间的ManyToOne

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