前言
今天在使用jpa
中的级联保存时,发现报
ini
A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance;
原因分析
其原因User
实体类有个字段
其关联表为
less
@Entity
@Table(name = "sys_user_client_type")
@Data
@FieldNameConstants
public class UserClientType extends FullAuditedEntity {
private static final long serialVersionUID= -1;
/**
* 客户端类型
*/
@Enumerated(EnumType.STRING)
private ClientTypeEnum clientType;
/**
* 用户
*/
@ManyToOne(optional = false, targetEntity=User.class)
@JoinColumn(name = "user_id", referencedColumnName = BaseEntity.Fields.id)
private User user;
}
在使用User更新级联的时候
ini
if (CollectionUtils.isNotEmpty(createOrUpdateUserInput.getUserClientTypes())) {
List<UserClientType> userClientTypeList = createOrUpdateUserInput.getUserClientTypes().stream()
.distinct()
.map(e -> {
UserClientType userClientType = new UserClientType();
userClientType.setClientType(e);
userClientType.setUser(user);
return userClientType;
}).collect(Collectors.toList());
user.setClientTypes(userClientTypeList);
}
报错,也就是说,更新该字段时不能使用setClientTypes(),需要使用set类的add或者addAll方法进行更新。
ini
// 设置clientType
List<ClientTypeEnum> clientTypeEnums = createOrUpdateUserInput.getUserClientTypes();
if (clientTypeEnums != null) {
List<UserClientType> userClientTypes = clientTypeEnums.stream().map(t -> {
UserClientType clientType = new UserClientType();
clientType.setClientType(t);
clientType.setUser(user);
return clientType;
}).collect(Collectors.toList());
user.getClientTypes().clear();
user.getClientTypes().addAll(userClientTypes);