我正在尝试用这个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;
}
我做错了什么?
2条答案
按热度按时间gcxthw6b1#
下面是答案
8yoxcaq72#
我不确定
UPDATE
是否是这里的正确操作,因为像这样更新多对多表并不常见。由于您正在添加角色,因此它应该是INSERT
操作,如果您想只替换所有角色,请在之前执行DELETE
。如果你想执行批量
INSERT
来提高性能,请查看saveAll
方法:https://stackoverflow.com/a/50882952/20991328