2013-04-30 3 views
0

, имеющих отношение m: n реального мира между некоторыми объектами, например. user < ---> group Теперь я хочу смоделировать эту взаимосвязь и хранить дополнительную информацию на ее основе, например. поле «качество».JPA: Моделирование m: n отношений и значений таблицы соединений

Я слышал, что я должен был бы создать новую таблицу соединения user_group следующим образом:

id | user_ref | group_ref | quality 
---------------------------------- 
1  1   1   0.5 
2  1   2   1.3 
... ...   ...  ... 

Соответствующее лицо имеет два взаимосвязанных лиц (частных пользователей) пользователя и группы, аннотированный с @ManyToOne - аннотаций. С другой стороны, у моего пользователя и моей группы есть набор связанных объектов user_group, как частных, так и объявленных с помощью @OneToMany -nnotation.

У меня есть три вопроса:

  1. это правильный способ смоделировать проблему дополнительных полей в JPA 2.0?
  2. Мне не разрешено использовать пользователя и группу в user_group как первичный ключ , так как они недопустимы для первичных ключей. Это действительно необходимо, чтобы объявить новый первичный.
  3. Является ли это обычным рабочим процессом с этими таблицами/сущностями?

...

EntityManager em = ... 
... 
em.getTransaction().begin(); 
User u = new User("Pete"); 
Group g = new Group("Anonymous workaholics") 
UserGroup ug = new UserGroup(); 
ug.addUser(u); 
ug.addGroup(g); 

em.persist(u); em.persist(g); em.persist(ug); 
em.getTransaction().commit(); 
em.close() 

Спасибо большое!

ответ

1
  1. Да, это хороший способ сделать это.
  2. Возможно иметь составной первичный ключ, состоящий из двух ассоциаций ManyToOne, но гораздо сложнее, как в сопоставлении, так и в остальной части приложения, обрабатывать это, а также менее эффективно. У вас есть сущность, поэтому просто делайте то же самое для всех других объектов и используйте автоматически сгенерированный первичный ключ с одним столбцом. Тот факт, что этот объект использовался как таблица соединений для ассоциации «многие-ко-многим», не имеет значения.
  3. Да, кажется, в порядке, за исключением addUser() и addGroup() методы должны быть названы setUser() и setGroup(): есть только один пользователь и одна группа для данного UserGroup. Я бы также использовал другое имя для самой сущности. Что-то вроде «Членство», например.
+0

Хорошо спасибо за ваш ответ в киберпространстве :) Позвольте мне подтвердить пункт 3: он должен быть установлен , поскольку это простой метод сеттера. –

+0

Да, точно. addXY используется для добавления XY в коллекцию XY. У вас нет сцепления здесь, а есть один атрибут. –

+0

Только для справки: http://en.wikibooks.org/wiki/Java_Persistence/ManyToMany#Mapping_a_Join_Table_with_Additional_Columns – miguelcobain

Смежные вопросы