【发布时间】:2020-05-28 04:23:59
【问题描述】:
我有一个 REST 端点,可用于创建或更新元素。这些元素的 REST 表示通过 Mapstruct 映射到我的 JPA 实体。现在为了更新现有实体,我将 @MappingTarget 传递给此方法:
@Mapping(source = "id", target = "id", ignore = true)
public abstract Element resourceToElement(ElementResource resource, @MappingTarget Element element);
实体Element 与一个子实体是一对多的关系,我们就叫它Child。关系在Element 内部是这样映射的:
@OneToMany(cascade = ALL, mappedBy = "element", orphanRemoval = true, fetch = EAGER)
private Collection<Child> children = new ArrayList<>();
像这样在Child 内部,Element 也是Child 主键的一部分:
@ManyToOne(fetch = LAZY, optional = false)
@JoinColumn(name = "element_id")
@JsonManagedReference
@Id
private Element element;
现在由于 JPA 托管实体的性质,在从资源映射到实体期间,我在插入 Child 表期间收到以下错误:
NULL not allowed for column "ELEMENT_ID"
似乎是这样,因为Element 已经是我要传入的托管实体,所以每当我通过添加(非托管)子项来修改它时,它都会尝试保留该元素。现在,我认为我要做的是将父 Element 分别设置为每个孩子,以便它知道持续查询的 element_id。但是在映射过程中的什么时候我会这样做?或者有没有更聪明的选择,我根本不必这样做?
【问题讨论】:
-
您可能还创建了
ChildResource对吧?如果是,是否包含element字段?