0

我有一个Order...

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将处理填充这些值。有没有我错过的东西,或者没有像我想象的那样工作?

4

2 回答 2

1

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

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

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

于 2013-03-01T14:41:08.877 回答
1

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

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

    for(OrderCustomField orderCustomField : getOrderCustomFields())
        orderCustomField.setOrder(this);
}
于 2013-03-01T14:53:26.940 回答