Hibernate: многие ко многим через дополнительную таблицу - PullRequest
2 голосов
/ 21 ноября 2011

У меня есть эти таблицы, организация может быть отправителем или получателем многих сообщений, сообщение может иметь 2 организации, которые отправляют или получают.Я знаю, что мой БД не имеет смысла, но я не могу изменить его:

enter imad description here

Итак, я могу подключить SenderReceiver к Msg как 1-к-n, и Organization к SenderReceiver как n-в-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>

Msg :

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 ]

1 голос
/ 21 ноября 2011

Таблица SenderReceiver имеет внешний ключ для организации и внешний ключ для сообщения. Это явный признак того, что SenderReceiver может иметь только одно Сообщение и одну организацию.

Таким образом, у вас есть

  • OneToMany между организацией и SenderReceiver,
  • a ManyToOne между SenderReceiver и Организацией,
  • OneToMany между Message и SenderReceiver
  • a ManyToOne между SenderReceiver и Message

Независимо от того, наносите ли вы на карту все эти ассоциации, решать вам. Каждая ассоциация может быть однонаправленной или двунаправленной.

1 голос
/ 21 ноября 2011

Я бы предложил это:

На мой взгляд, это отношение 2-N.Организация может отправить много сообщений, а сообщение может быть отправлено или получено только одной или двумя организациями.Вам не нужна таблица соединений.

Поместите набор сообщений в организацию - это будет представлять сообщения, отправленные / полученные организацией.Вы также можете сделать 2 набора - sentMSGS и receivedMSGS.

и поместить FK организации в само сообщение, так как это будет отражать организацию сообщения.Вы можете поставить sentID и receviedID в сообщении.

Я думаю, это облегчит понимание таблицы и программы.

Если вы решите остаться сВ исходных отношениях отношение многие ко многим будет представлено как:

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

Organization-SenderReceiver равно 1-N, а SenderReceiver-Msg равно N-1.

Итак, вы помещаете коллекцию SenderReceiver в классы Organization и Msg.И объекты как Organization и Msg внутри SenderReceiver.

...