Hibernate Multiple Association Issue - PullRequest
       17

Hibernate Multiple Association Issue

0 голосов
/ 22 марта 2011

У меня есть 3 сущностей. Пользователь, проект и роль. Пользователь может быть назначен на несколько проектов с некоторыми ролями. Пользователь GEORGE может иметь роль ADMIN в роли PROJECT-A и MANAGER в роли PROJECT-B . Как я могу сопоставить эти объекты, используя двунаправленную ассоциацию.

* Соотношение можно описать следующим образом.

ПОЛЬЗОВАТЕЛЬ может иметь много проектов через роль.

Роль может быть назначена 0 или более проектам для конкретного пользователя. *

Возможно ли это с JOIN-TABLE .

Ответы [ 2 ]

1 голос
/ 22 марта 2011

Вам нужно будет ввести четвертую сущность (назовем ее Right), которая сообщает, что конкретный пользователь играет определенную роль в конкретном проекте. Таким образом, вы закончите со следующими ассоциациями:

  • Один пользователь имеет много прав
  • Одна роль имеет много прав
  • Один проект имеет много прав

Правый объект будет сопоставлен с таблицей, имеющей три внешних ключа (для пользователя, роли и проекта), и кортеж (userId, projectId, roleId) должен быть уникальным.

Вам нужно будет использовать специальные запросы (или методы Java), чтобы найти роли пользователя в проекте:

public class User {
    // ...
    public Set<Role> getRolesForProject(Project project) {
        Set<Role> result = new HashSet<Role>();
        for (Right right : rights) {
            if (right.getProject().equals(project)) {
                result.add(right.getRole());
            }
        }
        return result;
    }
}

или, в HQL:

select role from Right right 
inner join right.role role 
where right.user = :user 
and right.project = :project
1 голос
/ 22 марта 2011

Если пользователь не может иметь несколько ролей в проекте, просто сопоставьте @ManyToOne Projects с вашим пользователем, и отношение Role будет находиться в вашем классе Project.

class User {
     @OneToMany (mappedBy = "projects")
     List<Project> projects;
     [...]
}

class Project {
     @ManyToOne
     User user;
     Role userRole;
     [...]
}

Это, однако, пренебрегает возможностьюУ вас есть несколько пользователей, назначенных на один проект, о котором вы не заявили, но я считаю, что это возможно.

Просто найдите аннотации Hibernate и двунаправленный (BI-WINNING!) в Google или в вашей любимой поисковой системе..

На самом деле здесь не вдавались в подробности, видя, что OP имеет только 29% приемлемого уровня ..

ура

...