Java 保存前未设置关系ID

Java 保存前未设置关系ID,java,spring,hibernate,Java,Spring,Hibernate,我有一个订单,它有 private Collection<OrderCustomField> orderCustomFields; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) public Collection<OrderCustomField> getOrderCustomFields() { return orderCustomFields; } @JsonProperty("Cust

我有一个
订单
,它有

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;
}

保存订单时,
order\u id
未填充在
OrderCustomField
中。我认为
cascade=CascadeType.ALL
将处理填充这些值。是否有我遗漏的东西,或者没有像我想象的那样工作?

当hibernate需要存储与数据库的双向关系,并且存在冲突信息(一方引用另一方,但不是相反)时,hibernate依赖于关系的拥有方。通过在
@OneToMany
上指定
mappedBy=“order”
,可以将多方声明为关系的拥有方

如果你把它去掉,那么拥有方就是关系的一方(这是一对多关系的默认值),你就会得到你想要的行为


但是,Hibernate建议您始终设置关系的双方。这是因为在实体进入数据库并重新加载之前,另一半不会被填充。换句话说,一旦打开二级缓存,就会出现问题,因为在缓存从数据库重新加载实体之前,订单字段将为空。

在这种情况下,
@PrePresist
为我工作

@PrePersist
public void beforeCreate() {
    if(created == null)
        created = new Timestamp(System.currentTimeMillis());

    for(OrderCustomField orderCustomField : getOrderCustomFields())
        orderCustomField.setOrder(this);
}

您是否为每个实体定义了
@Id
@GeneratedValue
?请参阅此问题的答案:mateusz-这很糟糕,因为这些对象是从Jersey映射的。我所有的其他协会都运作良好。
@PrePersist
public void beforeCreate() {
    if(created == null)
        created = new Timestamp(System.currentTimeMillis());

    for(OrderCustomField orderCustomField : getOrderCustomFields())
        orderCustomField.setOrder(this);
}