java - 保存前未设置关系 ID

标签 java spring hibernate

我有一个订单,其中包含...

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/

相关文章:

java - eclipse插件: perspective deprecated in shortcut

java - 如何通过 Apache POI 设置 Excel 中的单元格样式?

java - JPA/Hibernate - 如何急切地获取 EmbeddedId?

sql - 如何编写 JPQL 查询以查找此连接中未找到的记录?

java - 使用 epublib 逐页读取 epub 文件

java - 以线性方式映射对象列表

java - Sonar : Members of Spring components should be "@Autowired"

java - SpringBoot冲突数据库配置

java - 带有对象的通用请求接收 double 值而不是整数值

java - 如何在运行时获取 Hibernate 方言