java Spring更新许多manay解释权

rmbxnbpk  于 12个月前  发布在  Java
关注(0)|答案(2)|浏览(77)

我正在尝试用这个json更新我的实体:你可以看到我有这样的关系:乌滕特-若利乡

  • 我在json DTO中发送了一个列表,其中包含了ruoli的id和user的id

这是我的Utente JPA中的方法:

@Modifying(flushAutomatically = true, clearAutomatically = true)
    @Transactional
    @Query("UPDATE Utente u SET u.roles = :roles WHERE u.id = :userId")
    int saveUserRoles(@Param("userId") Integer userId, @Param("roles") Set<Ruoli> roles);

这就是我执行服务的地方:

public Utente addRolesToUser(RuoliDTO ruoliDTO) {
    log.info("{}.addRolesToUser adding user: {} to list roles: {}", this.getClass().getName(), ruoliDTO.getUser().getUsername(), ruoliDTO.getRoles().size());
    Utente utente = ruoliDTO.getUser();
    Set<Ruoli> rolesToAdd = ruoliDTO.getRoles();
    utente.setRoles(ruoliDTO.getRoles());
     userRepository.saveUserRoles(utente.getId(), rolesToAdd);
     return utente;
}

我总是得到这个错误:

Parameter value [Ruoli{id=2, roleName='ADMIN', description='admin', privileggi=[Privileggi{id=1, privName='UNICACON_MDJS_USER', description='basic user', active=false}, Privileggi{id=3, privName='UNICACON_MDJS_ADMIN', description='admin role', active=true}, Privileggi{id=4, privName='ARCHICON_MDJS_USER', description='archicon role', active=true}]}] did not match expected type [java.util.Set (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [Ruoli{id=2, roleName='ADMIN', description='admin', privileggi=[Privileggi{id=1, privName='UNICACON_MDJS_USER', description='basic user', active=false}, Privileggi{id=3, privName='UNICACON_MDJS_ADMIN', description='admin role', active=true}, Privileggi{id=4, privName='ARCHICON_MDJS_USER', description='archicon role', active=true}]}] did not match expected type [java.util.Set (n/a)]

这些是我的实体:

@Entity
    @Table(name = "utente")
@Data
    public class Utente implements Serializable {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
    
        @JsonIgnoreProperties("utenti")
        @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
        @JoinTable(
                name = "utente_ruolo",
                joinColumns = @JoinColumn(name = "utente_id", referencedColumnName = "id"),
                inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id")
        )
        private List<Ruoli> roles;
    }


 @Data
    @Entity
    @Table(name = "ruoli")
    public class Ruoli implements Serializable {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
    
        @JsonIgnore
        @ManyToMany(cascade ={ CascadeType.MERGE, CascadeType.PERSIST})
        @JoinTable(
                name = "utente_ruolo",
                joinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"),
                inverseJoinColumns = @JoinColumn(name = "utente_id", referencedColumnName = "id")
        )
        private List<Utente> utenti;
    }

    @Entity
    @Data
    @Table(name = "privileggi")
    public class Privileggi implements Serializable {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
    
        @Column(name = "priv_name")
        private String privName;
    
        @Column(name = "description")
        private String description;
    
        @Column(name = "active")
        private Boolean active;
    
        @JsonIgnore
        @ManyToMany( cascade ={ CascadeType.MERGE, CascadeType.PERSIST})
        @JoinTable(
                name = "ruolo_privileggi",
                joinColumns = @JoinColumn(name = "priv_id", referencedColumnName = "id"),
                inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id")
        )
        private List<Ruoli> ruoli;
    }

我做错了什么?

gcxthw6b

gcxthw6b1#

下面是答案

  • 首先,您需要从数据库中获取Utente实体。
  • 然后,您可以使用RuoliDTO中的角色更新Utente实体的角色。
  • 最后,您可以将更新后的Utente实体保存回数据库。
public Utente addRolesToUser(RuoliDTO ruoliDTO) {
     log.info("{}.addRolesToUser adding user: {} to list roles: {}", this.getClass().getName(), ruoliDTO.getUser().getUsername(), ruoliDTO.getRoles().size());

     // 1. Fetch the Utente entity from the database.
     Utente utente = userRepository.findById(ruoliDTO.getUser().getId()).orElse(null);

     if (utente != null) {
         // 2. Update the Utente entity's roles with the roles from RuoliDTO.
         utente.setRoles(ruoliDTO.getRoles());

         // 3. Save the updated Utente entity back to the database.
         utente = userRepository.save(utente);
     }

     return utente;
 }
8yoxcaq7

8yoxcaq72#

我不确定UPDATE是否是这里的正确操作,因为像这样更新多对多表并不常见。由于您正在添加角色,因此它应该是INSERT操作,如果您想只替换所有角色,请在之前执行DELETE
如果你想执行批量INSERT来提高性能,请查看saveAll方法:https://stackoverflow.com/a/50882952/20991328

相关问题