【问题标题】:Joining entities with @ManyToMany relationship使用 @ManyToMany 关系连接实体
【发布时间】:2015-09-15 10:56:09
【问题描述】:

我有这些实体:

  • 用户
  • 角色
  • 权限

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

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

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

这是我目前所拥有的:

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 托管 Bean 中?

【问题讨论】:

  • 就是这样。问题是什么?使用您提供的信息和关系层次结构,这是循环的唯一方法。您在哪里需要帮助?
  • @KarthikR 只是想知道这是否会非常低效,而不是使用 EJBQL 或类似方法对表进行 JOIN。

标签: jpa join many-to-many


【解决方案1】:

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

例如,如果您的集合已通过连接查询预取,那么在 Java 中遍历它们是微不足道的。如果没有,for 循环中的每次访问都会导致查询填充对象。如果它一直是最后一个,则意味着您的 java 代码会导致您以最糟糕的方式遍历对象图,最好提前获取它。因此,您将失去延迟访问的任何好处,最好访问数据库一次以查询链接到该用户的权限,其权限字符串名称为:“Select p from u User join u.roles r join r.permissions p其中 p.name = :permissionName"。

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

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多