【问题标题】:How to delete specific data from join table(role_acces) in springboot jpa如何在spring boot jpa中从连接表(role_acces)中删除特定数据
【发布时间】:2022-09-24 15:43:19
【问题描述】:

我有这个错误的问题,我想从连接表 role_access 中删除特定数据,但删除表内的随机数据。我应用了多对多映射,其中包括角色、访问权限和链接表角色访问权限。我已经尝试使用迭代器删除(),但没有奏效。任何人请帮助我,谢谢。

在这里我分享我的代码:

角色.java

    @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.REFRESH, CascadeType.MERGE, CascadeType.REMOVE,
        CascadeType.PERSIST })
@JoinTable(name = \"role_access\", joinColumns = {
        @JoinColumn(name = \"roleId\", referencedColumnName = \"rid\") }, inverseJoinColumns = {
                @JoinColumn(name = \"accessId\", referencedColumnName = \"id\") })
private List<Access> access = new ArrayList<>();

角色控制器.java

    @PostMapping(\"/delete/access/{roleName}\")
public ResponseEntity<Object> deleteRoleAccess(@PathVariable String roleName) {
    return roleService.deleteRoleToAccess(roleName);
}

RoleRepository.java

@Repository
public interface RoleRepository extends JpaRepository<Role, Long> {

Optional<Role> findByRoleName(String roleName);

Optional<Role> findByRid(Long rid); }

角色服务.java

    public ResponseEntity<Object> deleteRoleToAccess(String roleName) {
    if (roleRepository.findByRoleName(roleName).isPresent()) {
        Role r = roleRepository.findByRoleName(roleName).get();

        for (int i = 0; i < r.getAccess().size(); i++) {
            if (accessRepository.findByAccName(r.getAccess().get(i).getAccName()).isPresent()) {
                Access access = r.getAccess().get(i);

                delAccess(r, access.getAccName());
            } else
                return ResponseEntity.unprocessableEntity().body(\"Role name not found\");
        }
        roleRepository.save(r);
    }
    return ResponseEntity.ok(\"access is successfully delete\");
}



    public void delAccess(Role role, String accName) {

    Optional<Access> aOpt = accessRepository.findByAccName(accName);

    if (!aOpt.isPresent()) {
        throw new CustEmailNotFoundexception(\"Access name cannot be null\");
    }
    if (aOpt.isPresent() && aOpt.equals(aOpt)) {
        role.getAccess().remove(aOpt.get());
    }}
  • 您需要更清楚地了解您要实现的目标。您是否只想删除角色具有给定角色名称的角色访问表中的所有条目?
  • @johnnyutts 好的,谢谢。是的,我想删除角色中的访问权限。我确实检查了 RoleService 文件。 public void removeRoleAccess(Role role, String accName) { Optional<Access> accessName = accessRepository.findByAccName(accName); if (!accessName.isPresent()) { throw new CustEmailNotFoundexception(\"访问名称不能为空\"); } role.getAccess().remove(accessName.get()); }

标签: java spring-boot arraylist spring-data-jpa


【解决方案1】:

我认为您的服务使事情变得过于复杂,可以简化为这样的事情

    @Transactional
    public ResponseEntity<Object> deleteRoleToAccess(String roleName) {
        Optional<Role> optionalRole = roleRepository.findByRoleName(roleName);
        if (!optionalRole.isPresent()) {
            return ResponseEntity.unprocessableEntity().body("Role name not found");
        }

        Role role = optionalRole.get();

        List<Access> removeList = new ArrayList<>(role.getAccesses());
        for (Access access : removeList) {
            role.removeAccess(access);
        }

        return ResponseEntity.ok("access is successfully delete");
    }

但要这样做,您需要对实体进行更改

// Role
@Entity
public class Role {
    @Id
    @Column(name = "rid")
    private Long rid;
    private String roleName;

    @ManyToMany(
            fetch = FetchType.EAGER,
            cascade = {
                    CascadeType.PERSIST,
                    CascadeType.MERGE
            }
    )
    @JoinTable(name = "role_access",
            joinColumns = @JoinColumn(name = "roleId"),
            inverseJoinColumns = @JoinColumn(name = "rid")
    )
    private List<Access> accesses = new ArrayList<>();

    public Long getRid() {
        return rid;
    }

    public void setRid(Long rid) {
        this.rid = rid;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public List<Access> getAccesses() {
        return accesses;
    }

    public void addAccess(Access access) {
        accesses.add(access);
        access.getRoles().add(this);
    }

    public void removeAccess(Access access) {
        accesses.remove(access);
        access.getRoles().remove(this);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Role role = (Role) o;
        return getRid().equals(role.getRid());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getRid());
    }
}

// Access
@Entity
public class Access {
    @Id
    @Column(name = "id")
    private Long accessId;
    private String accName;

    @ManyToMany(mappedBy = "accesses")
    private List<Role> roles = new ArrayList<>();

    public Long getAccessId() {
        return accessId;
    }

    public void setAccessId(Long accessId) {
        this.accessId = accessId;
    }

    public String getAccName() {
        return accName;
    }

    public void setAccName(String accName) {
        this.accName = accName;
    }

    public List<Role> getRoles() {
        return roles;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Access access = (Access) o;
        return getAccessId().equals(access.getAccessId());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getAccessId());
    }
}

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 2021-07-12
    • 2016-12-17
    • 2016-12-12
    • 1970-01-01
    • 2020-03-29
    • 2021-03-03
    • 2022-01-11
    • 1970-01-01
    相关资源
    最近更新 更多