我正在try 通过以下json更新我的实体多对多: 如你所见,我有这样的关系:Uente-Ruoli,Ruoli-Privileggi

  • 我在json DTO中发送了一个用于rooli的id列表和一个用于用户的id列表

这是我的Uante 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;
    }

我做错了什么?

推荐答案

以下是显示的答案

  • 首先,您需要从数据库中获取Utente实体.

  • 然后,您可以使用来自RuoliDTO的角色来更新Uente实体的角色.

  • 最后,您可以将更新后的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;
     }
    

Java相关问答推荐

Spring bootstrap @ Asmat注释与@ Routed

PostgreSQL货币兑换率查询

Apache POI:使用反射获取zoom 级别

CAMEL 4中的SAXParseException

为什么不应用类型推断?

Java中的死锁及其重入锁和锁

把一条整型短裤和两条短裤装成一条长的

我可以在MacOS上使用什么Java函数来在适当的设备上以适当的音量播放适当的alert 声音?

在JDK 1.8源代码中,为什么使用A-B 0来确定哪个更大,而不是A B?

为什么我的回收视图会显示重复的列表?

虚拟线程应该很快消亡吗?

如何用内置Java从JavaFX应用程序中生成.exe文件?

根本不显示JavaFX阿拉伯字母

Spring Framework6.1中引入的新RestClient是否有适合于测试的变体,就像RestTemplate和TestRestTemplate一样?

使IntelliJ在导入时优先 Select 一个类或将另一个标记为错误

接受类及其接口的Java类型(矛盾)

Java CDI:@Singleton@Startup@Inject无法实现接口

如何在JSP中从select中获取值并将其放入另一个select

AspectJ编织外部依赖代码,重新打包jar并强制依赖用户使用它

放置在变量中的Java成员引用不相等