Вам нужно будет ввести четвертую сущность (назовем ее 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