Картографиране на съставен външен ключ в хибернация

Зададох въпрос тук за това как да проектирате схема на база данни.

В обобщение имам адресна книга, която може да съдържа контакти и групи. Групите също могат да съдържат контакти, но само контакти, които са в същата адресна книга като тях.

Адресна книга
Идент. № на адресната книга

Контакт
id
ID адресна книга

Група
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>();
    //----
  }

И мисля, че няма нужда да добавяте групи за събиране към Контакт. Можете да изберете групи по идентификатор на контакт от таблицата с групи. Освен това трябва да добавите id към всяка таблица.

  @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
След това трябва да направите следния начин: Контактите могат да бъдат само вътре в групи (ако групата не е посочена - контактите се поставят в НЕКАТЕГОРИЗИРАНА група, която е по подразбиране във всяка адресна книга). Тогава групата има само една родителска адресна книга. - person Sergey Galchenko; 05.08.2011
comment
Това няма да работи, имам нужда от връзка много към много между контакти и групи. В моята система контактите няма да са в групи през повечето време. Вашето решение все още означава, че е възможно да добавяте контакти към групи, дори ако контактът принадлежи към друга адресна книга. - person mogronalol; 05.08.2011