hibernate: отображение тройной ассоциации

Описание технологии: аннотация Hibernate — 3.4.0.GA java 1.5

таблица : users_roles_branches столбцы : user_id, role_id, branch_id

Пользователю назначаются разные роли для разных филиалов компании.

Теперь у меня есть один класс java pojo

     public class branch
     {
                @ManyToMany
             @JoinTable(name = "users_roles_branches", joinColumns = {   @JoinColumn(name="branch_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") })
             @MapKeyManyToMany(joinColumns = { @JoinColumn(name = "user_id", unique = false) })

                public Map<User, Role> getUserRoleMap() {
          return userRoleMap;
           }
     } 

Основное требование — получить список ролей, назначенных разным пользователям в ветке.

Столкнувшись с проблемой: поскольку одному пользователю может быть назначено несколько ролей, карта не будет работать для данных сопоставления ролей пользователя.

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

Пожалуйста, помогите мне!

Если вопрос не понятен или не в представимой форме, пожалуйста, дайте мне знать.


person Maddy.Shik    schedule 11.12.2010    source источник


Ответы (1)


Мое предложение состояло бы в том, чтобы ввести новую концепцию в вашу доменную модель RoleAssignment:

class RoleAssignment {
  private User user; 
  private Branch branch;
  private Role role;
}

Объекты User, Branch и Role должны иметь отношения 1:N с RoleAssignment. Например:

class User { 
  private Set<RoleAssignment> roleAssignemnts;
}
person Binil Thomas    schedule 15.12.2010
comment
Я хочу избежать создания класса, который напрямую не сопоставлен с сущностью. Ваше решение выполнимо, но есть ли другой возможный способ избежать создания каких-либо дополнительных классов, кроме Role, User, Branch. Например, использовать некоторую коллекцию или некоторую оболочку коллекции. Спасибо за ответ. - person Maddy.Shik; 15.12.2010
comment
@ Maddy.Shik Hibernate, похоже, поддерживает троичные ассоциации. См. docs.jboss. org/hibernate/core/3.6/reference/en-US/html/ . Будет ли это работать для вас? - person Binil Thomas; 16.12.2010
comment
@Entity public class Company { @Id int id; ... @OneToMany // однонаправленный @MapKeyJoinColumn(name=employee_id) Map‹Employee, Contract› контракты; } В этом примере, если у Employee есть несколько контрактов, это не сработает, что очень вероятно в тернарной ассоциации. - person Maddy.Shik; 17.12.2010
comment
как в этом случае будет выглядеть сопоставление пользователей? - person Bizmarck; 16.11.2011