当前位置: 首页 > 知识库问答 >
问题:

连接具有@ManyTomany关系的实体

姚昊焱
2023-03-14

我有这些实体:

  • 用户
  • 角色
  • 权限

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

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;
}
    null

共有1个答案

常源
2023-03-14

这取决于您的映射、列表中的对象数、是否已提取列表、您的数据库连接、数据库调优等。
您必须尝试使用生产数据来确定哪种方法是最好的。

例如,如果您的集合是用联接查询预取的,那么在Java中遍历它们就很简单了。如果没有,则for循环中的每次访问都将导致一个查询填充对象。如果它一直是最后一个,这意味着您的java代码导致您以最坏的方式遍历对象图,最好是提前获取它。因此,您将失去惰性访问的任何好处,最好是访问一次数据库,以查询链接到该用户的权限,该用户的权限名为:“Select p from u user join u roles r join r.permissions p where p name=:permissionname”。

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

 类似资料:
  • 我有两个实体,用户和电影。他们是很多双向的关系。我的问题是,当我通过我的控制器删除一部电影时,它也会删除所有与该电影相关的实体。My user和this user角色和movie实体。我要做什么,从表中删除电影实体,并保持用户与他的角色,而不是删除他们所有。

  • 当我试图使用ebean缓存系统(带有io.ebean:ebean-redis)读取@ManyTomany关系时,我遇到了一个异常。这是一个springboot应用程序。 我正在使用的版本: SpringBootVersion=2.4.3 MariaDbVersion=2.7.2 EBeanVersion=12.7.2 Flywayversion=7.7.0 BaseModel Java类: 文章J

  • 问题内容: 需要使用意大利语翻译查找所有单词,如果不存在意大利语,则需要使用西班牙语(默认语言)。 我不能使用多个查询,并且存在条件(技术限制) 字 笔译 结果: 这段代码返回了我需要的全部信息,但是我无法在我所处的情况下使用存在条件的地方 问题答案: 我会在桌子上加入桌子两次,每种语言一次:

  • 与本文类似,我有以下(几乎相同)类: 区别在于我的属性是私有的(使用bean作为实体)。 问题是:我如何创建一个查询来返回一个确定的人的所有项目(在JPQL和/或使用CriteriaQuery)? 我找到了所有其他类似的问题,但没有一个对我有帮助,因为所有这些问题都依赖于从项目到人员的导航(不存在从人员的查询): JPQL多人选择 @许多JPA 2复杂查询 JPA 2.0 CriteriaQuer

  • 我正在创建医生、患者和专科三张表。患者可以有一个全科医生,但一个医生可以是许多患者的全科医生。每个医生都有自己的专长(例如神经外科医生、心脏病专家、泌尿科医生等)。当我尝试使用中间表在医生和专长之间建立多对多连接时,我会遇到一个错误“创建名为“entityManagerFactory”的bean时出错,该bean在类路径资源中定义”由特定mappedBy引用未知目标实体属性中的BeanCreati

  • 问题内容: 假设我有两个实体:“组”和“用户”。每个用户可以是多个组的成员,每个组可以有多个用户。 现在,我要删除一个组(假设它有很多成员)。 问题是,当我在某个组上调用EntityManager.remove()时,JPA提供程序(在我的情况下为Hibernate) 不会从联接表中删除行, 并且由于外键约束,删除操作也会失败。在User上调用remove()可以正常工作(我想这与拥有关系的一方有