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

この場合、@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 に答える
1

Hibernate がデータベースへの双方向の関係を保存する必要があり、競合する情報がある場合 (一方が他方を参照しますが、その逆はありません)、Hibernate は関係の所有側に依存します。で指定することによりmappedBy="order"@OneToManyリレーションシップの所有側が多側であると宣言します。

これを取り除けば、所有側がリレーションシップの一方の側になり (これが 1 対多リレーションシップのデフォルトです)、必要な動作が得られます。

ただし、Hibernate では常に関係の両側を設定することをお勧めします。これは、エンティティがデータベースに移動してリロードされるまで、残りの半分が入力されないためです。つまり、二次キャッシュをオンにするとすぐに、キャッシュがデータベースからエンティティをリロードするまで順序フィールドが null になるため、問題が発生し始めます。

于 2013-03-01T14:41:08.877 に答える