我有這樣的Hibernate映射後兩次堅持孩子:Hibernate試圖設置父
家長:
@OneToMany(mappedBy = "parent")
@Valid
private Set<Assignment> assignments;
兒童:
@ManyToOne(cascade = {CascadeType.PERSIST})
@JoinColumn(name = "parent_id")
@Valid
private Parent parent;
我有這樣的情況:家長已經存在於數據庫中,我得到新的Assignments列表。我做(使用Spring數據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));
}
}
我檢查下調試的對象,例如分配是對象@ 17609和家長是@ 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)
我已經調試和分配實體的@PrePersist方法休眠調用它的另一個對象,這是分配@ 17646,其中包含父@ 17608,和家長包含的子集的一個元素,它是@ 17609。
爲什麼hibernate試圖堅持另一個對象?
我認爲你應該只添加assignements母公司和堅持父母,沒有需要設置家長分配 – Antoniossss
你得到了什麼樣的例外...你可以發佈它嗎? –
@Antoniossss,如果我沒有設置父級,hibernate不會自動執行此操作,並嘗試使用parentId = null持續賦值,這是不正確的。如果我在Assignment的父映射中更改了實體關係並添加了nullable =「false」,那麼hibernate會嘗試執行相同的操作(將parent設置爲賦值),併發生相同的異常。 – mdziob