Сопоставление составного внешнего ключа в спящем режиме

Я задал вопрос здесь о том, как разработать схему базы данных.

Таким образом, у меня есть адресная книга, которая может содержать контакты и группы. Группы также могут содержать контакты, но только те, которые находятся в той же адресной книге, что и они.

Адресная книга
Идентификатор адресной книги

Контакт
идентификатор
Идентификатор адресной книги

Группа
id
Идентификатор группы

Группа для контакта
идентификатор
идентификатор адресной книги
идентификатор контакта
идентификатор группы

Добавляя идентификатор адресной книги в таблицу отношений «многие ко многим», я могу обеспечить соответствие адресных книг. Однако я относительно новичок в спящем режиме, поэтому:

  @Entity
  @Table(name = "Contact")
  public class Contact 
  {
    Addressbook addressbook;

    //----bidirectional association
    private List groups = new ArrayList();
    //----
  }

  @Entity
  @Table(name = "Group")
  public class Group 
  {
    Addressbook addressbook;
    //----bidirectional association
    private List contacts = new ArrayList();
    //----
  }

Итак, в начальной точке у меня были бы две вышеупомянутые таблицы, и мне нужно было бы, чтобы коллекции контролировались спящим режимом таким образом, чтобы обеспечить соответствие идентификатора адресной книги при добавлении или изменении объектов в коллекции.


person mogronalol    schedule 05.08.2011    source источник


Ответы (1)


Вам нужно указать тип элементов в коллекции и добавить аннотацию ManyToMany

  @Entity
  @Table(name = "Contact")
  public class Contact 
  {

    @Id
    @GeneratedValue(GenerationType=AUTO)
    private Integer contact_id;

    Addressbook addressbook;

    //----bidirectional association
    //@ManyToMany
    //private List<Group> groups = new ArrayList<Group>();
    //----
  }

И я думаю, что нет необходимости добавлять группы сбора в Контакт. Вы можете выбрать группы по идентификатору контакта из таблицы групп. Кроме того, вам нужно добавить идентификаторы в каждую таблицу.

  @Entity
  @Table(name = "Group")
  public class Group 
  {
    @Id
    @GeneratedValue(GenerationType=AUTO)
    private Integer group_id;

    Addressbook addressbook;
    //----bidirectional association
    @ManyToMany
    private List<Contact> contacts = new ArrayList<Contact>();
    //----
  }
person Sergey Galchenko    schedule 05.08.2011
comment
Это не заставляет контакты и группы содержать одну и ту же адресную книгу, или я что-то упустил. Конечно, я хочу коллекции на обоих концах? Т.е. из контакта получить все его группы, или из группы получить все его контакты? - person mogronalol; 05.08.2011
comment
Тогда вам нужно поступить следующим образом: Контакты могут быть только внутри групп (если группа не указана - контакты помещаются в группу UNCATEGORIZED, которая по умолчанию есть в каждой адресной книге). Тогда у группы будет только одна родительская AddressBook. - person Sergey Galchenko; 05.08.2011
comment
Это не сработает, мне нужны отношения «многие ко многим» между контактами и группами. В моей системе контакты большую часть времени не будут находиться в группах. Ваше решение также означает, что контакты можно добавлять в группы, даже если контакт принадлежит к другой адресной книге. - person mogronalol; 05.08.2011