【发布时间】:2017-05-11 18:54:35
【问题描述】:
我有这样的 Hibernate 映射:
家长:
@OneToMany(mappedBy = "parent")
@Valid
private Set<Assignment> assignments;
孩子:
@ManyToOne(cascade = {CascadeType.PERSIST})
@JoinColumn(name = "parent_id")
@Valid
private Parent parent;
我遇到了这样的情况:父级已经保存在数据库中,我得到了新的分配列表。我做了这样的事情(使用 Spring Data JPA):
parent.getAssignments().addAll(newAssignments);
parent.getAssignments().forEach(assignment -> assignment.setParent(parent));
parentRepository.save(parent);
我在基本实体中有@PrePersist 注释方法(由两者扩展),并通过验证检查createdDate,它在@PrePersist 中初始化是否不为空。基础实体包含:
@NotNull
@Column(name = "created_date")
protected LocalDateTime createdDate;
@PrePersist
public void prePersist() {
setCreatedDate(LocalDateTime.now());
setModifiedDate(LocalDateTime.now());
validateEntity();
}
private void validateEntity() {
Set<ConstraintViolation<BaseEntity>> violations = Validation.buildDefaultValidatorFactory().getValidator().validate(this);
if(!violations.isEmpty()) {
throw new RuntimeException(new ValidationMessageBuilder().build(violations));
}
}
我检查了调试器下的对象,例如Assignment是对象@17609,Parent是@17608。
调用 save() 方法后引发异常。
java.lang.RuntimeException: may not be null => com.foo.bar.model.domain.Assignment.parent.assignments.createdDate.
at com.foo.bar.model.BaseEntity.validateEntity(BaseEntity.java:70)
at com.foo.bar.model.BaseEntity.prePersist(BaseEntity.java:58)
我已经调试并在Assignment实体的@PrePersist方法中为另一个对象调用它,即Assignment@17646,它包含Parent@17608,而parent包含具有一个元素的子元素集合,即@17609。
为什么hibernate会尝试持久化另一个对象?
【问题讨论】:
-
我认为你应该只将assignements添加到parent并坚持parent,不需要将parent设置为assignement
-
您遇到了什么样的异常...您可以发布吗?
-
@Antoniossss,如果我不设置 parent,hibernate 不会自动执行此操作,并尝试使用 parentId = null 保持分配,这是不正确的。如果我更改实体关系并在分配的父映射中添加 nullable="false" 则休眠尝试执行相同操作(将父设置为分配)并发生相同的异常。
-
@CarlitosWay 编辑并添加了异常。
标签: java hibernate jpa spring-data-rest