使用@ManyToMany关系加入实体

时间:2015-09-15 10:56:09

标签: jpa join many-to-many

我有这些实体:

  • 用户
  • 作用
  • 权限

用户有很多角色,角色有很多权限。

检索用户拥有的一组权限的最佳方法是什么?

我需要一种方法来检查用户是否具有特定的权限。

这是我到目前为止所做的:

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中?
  • 在Authentication JSF Managed Bean中?

1 个答案:

答案 0 :(得分:1)

这取决于您的映射,列表中的对象数,是否已获取列表,数据库连接,数据库调整等。
您必须尝试使用​​生产数据来确定最佳方法。

例如,如果您的集合已经使用连接查询预取,那么在Java中遍历它们是微不足道的。如果他们没有,那么for循环中的每次访问都会导致查询填充对象。如果它始终是最后一个,那就意味着你的java代码会以最坏的方式遍历你的对象图,而且最好先提取它。因此,您将失去延迟访问的任何好处,并且最好一次使用permissionString名称查询链接到此用户的权限:"从用户加入u.roles r join r中选择p .permissions p其中p.name =:permissionName"。

只有对生产数据进行测试才能为您的情况提供最佳答案,应用程序和映射中的许多其他决策都会改变结果。