Spring JPA创建具有空值的实体

时间:2017-03-24 11:05:46

标签: java spring hibernate jpa spring-data-jpa

我有以下代码:

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;
    }
}

1 个答案:

答案 0 :(得分:1)

不是100%但在我看来问题可能如下:

CrudRepository实现save方法,检查您要保存的对象是新实体还是现有实体。如果它是已存在的,则执行merge操作。这将是您的案例中发生的情况,因为groupModel是现有实体。

现在,在@OneToMany依赖项上,您只有这些级联选项:

cascade = { CascadeType.PERSIST, CascadeType.REMOVE }

如果添加CascadeType.MERGE,则应将操作传播到UserFromGroup实体并保留它们(当实体是新实体时,合并的默认行为)。