我有以下代码:
groupModel.getUserFormGroups().clear();
for(MemberDTO member : group.getMembers()){
User u = userRepository.findByEmail(member.getEmail());
System.out.println(member.getEmail() + " " + groupModel.getName() + " " + member.getRole());
if(u == null){
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
groupModel.getUserFormGroups().add(new UserFormGroup(u, groupModel, UserFormGroupRole.ADMIN));
}
try{
groupRepository.save(groupModel);
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
} catch (DataIntegrityViolationException e){
System.out.println(e.getMessage());
System.out.println(e.getClass());
return ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY).build();
}
当我运行它时,新的UserFormGroups
有一个id,所有其他字段都是null。完全更新ManyToOne关系有什么问题吗?
在组实体上,我有以下OneToMany关系:
@OneToMany(targetEntity=UserFormGroup.class, cascade = { CascadeType.PERSIST, CascadeType.REMOVE }, fetch = FetchType.EAGER, mappedBy = "formGroup", orphanRemoval=true)
private Set<UserFormGroup> userFormGroups = new HashSet<>();
UserFormGroup关系如下所示:
@Entity
@Table(uniqueConstraints={
@UniqueConstraint(columnNames = {"user", "form_group"})
})
public class UserFormGroup implements Serializable{
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private long id;
@ManyToOne
@JoinColumn(name = "user",referencedColumnName = "id")
private User user;
@ManyToOne
@JoinColumn(name = "form_group", referencedColumnName = "id")
private FormGroup formGroup;
@Column(name = "role")
private UserFormGroupRole role;
public UserFormGroup() {
}
public UserFormGroup(User user, FormGroup group, UserFormGroupRole role) {
this.user = user;
this.formGroup = group;
this.role = role;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public FormGroup getFormGroup() {
return formGroup;
}
public void setFormGroup(FormGroup formGroup) {
this.formGroup = formGroup;
}
public UserFormGroupRole getRole() {
return role;
}
public void setRole(UserFormGroupRole role) {
this.role = role;
}
}
答案 0 :(得分:1)
不是100%但在我看来问题可能如下:
CrudRepository实现save
方法,检查您要保存的对象是新实体还是现有实体。如果它是已存在的,则执行merge
操作。这将是您的案例中发生的情况,因为groupModel
是现有实体。
现在,在@OneToMany依赖项上,您只有这些级联选项:
cascade = { CascadeType.PERSIST, CascadeType.REMOVE }
如果添加CascadeType.MERGE
,则应将操作传播到UserFromGroup实体并保留它们(当实体是新实体时,合并的默认行为)。