保存前未设置关系ID

时间:2013-03-01 13:34:34

标签: java spring hibernate

我有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会处理填充这些值。有没有我错过的东西,或者那是不是我认为的那样?

2 个答案:

答案 0 :(得分:1)

当hibernate需要存储与数据库的双向关系并且存在冲突的信息(一方引用另一方但反之亦然),那么Hibernate依赖于关系的拥有方面。通过在mappedBy="order"上指定@OneToMany,您宣布许多方面是该关系的拥有方。

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

但是,Hibernate建议您始终设置关系的两个方面。这是因为在实体进入数据库并重新加载之前,另一半不会被填充。换句话说,只要打开二级缓存,就会出现麻烦,因为在缓存从数据库重新加载实体之前,order字段将为null。

答案 1 :(得分:1)

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

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

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