2015-09-15 5 views
0

У меня есть эти объекты:Объединение субъектов с @ManyToMany отношений

  • пользователя
  • Роль
  • Разрешение

Пользователь имеет множество ролей и роль имеет множество разрешений.

Каков наилучший способ получить набор разрешений пользователя?

Мне нужен способ проверить, имеет ли Пользователь определенное разрешение.

Это то, что я до сих пор:

public boolean hasPermission(String permissionString) { 
    if (!authenticated) return false; 
    for (Role role : user.getRoles()) { 
     for (Permission permission : role.getPermissions()) { 
      if (permission.getName().equals(permissionString)) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

Второй, но связанный с этим вопрос - где я должен поставить код, который проверяет, является ли пользователь имеет особое разрешение?

  • В объекте пользователя?
  • В UserBean EJB?
  • В аутентифицированном JSF управляемом компоненте?
+0

Вот как это сделать. Что за вопрос? С информацией, которую вы предоставили, и иерархией отношений, это единственный способ прокрутки. Где вам нужна помощь? –

+0

@ KarthikR Было просто интересно, будет ли это очень неэффективно, вместо JOIN на таблицах с использованием EJBQL или подобных. – mushroom

ответ

1

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

Например, если ваши коллекции были предварительно запрограммированы с помощью запроса объединения, то перемещение их по Java является тривиальным. Если они этого не сделали, каждый доступ в цикле for заставит запрос заполнять объекты. Если это последний раз все время, это означает, что ваш код java приводит к тому, что вы пересекаете свой график объектов наихудшим образом, и было бы лучше получить его заранее. Таким образом, вы потеряете какую-либо выгоду от ленивого доступа и будете лучше ударять базу данных один раз, чтобы запросить разрешение, связанное с этим пользователем, с именем разрешенияString: «Выберите p из u User join u.roles r join r.permissions p где p.name =: permissionName ".

Только тестирование производственных данных даст вам наилучший ответ для вашей ситуации, а множество других решений в приложении и сопоставлениях изменят результат.

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