我有一个订单
,其中包含...
private Collection<OrderCustomField> orderCustomFields;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
public Collection<OrderCustomField> getOrderCustomFields() {
return orderCustomFields;
}
@JsonProperty("CustomFields")
public void setOrderCustomFields(Collection<OrderCustomField> orderCustomFields) {
this.orderCustomFields = orderCustomFields;
}
并且 OrderCustomFields
具有
private Order order;
@ManyToOne
@javax.persistence.JoinColumn(name = "order_id", referencedColumnName = "id", nullable = false)
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
保存订单时,order_id
未填充到 OrderCustomField
中。我认为 Cascade = CascadeType.ALL 会处理填充这些值。有什么我错过的,或者没有像我想象的那样工作吗?
最佳答案
当 Hibernate 需要存储与数据库的双向关系并且存在冲突信息(一方引用另一方,但反之亦然)时,Hibernate 依赖关系的拥有方。通过在 @OneToMany
上指定 mappedBy="order"
,您将声明多方为关系的拥有方。
如果您将其取消,那么拥有方将成为关系的一侧(这是一对多关系的默认设置),您将得到您想要的行为。
但是,Hibernate 建议您始终设置关系的双方。这是因为在实体进入数据库并重新加载之前,另一半不会被填充。换句话说,一旦你打开二级缓存,你就会开始遇到麻烦,因为订单字段将为空,直到缓存从数据库重新加载实体。
关于java - 保存前未设置关系 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15159042/