0

親エンティティOrderと子エンティティがありOrderItemます。Orderと一緒にオブジェクトを保存したいのですSet<OrderItem>が、idOrderオートインクリメントです。Orderとの間OrderItem1 対多の関係です。OrderItem親への参照を含めますOrder。したがって、Orderアイテムは最初に保存する必要があり、次にOrderItemを割り当てて保存する必要がありますidOrder

ここにOrder.hbm.xmlがあります

<class name="hibernate.Order" table="order" catalog="my">
    <id name="idOrder" type="java.lang.Integer">
        <column name="id_order" />
        <generator class="identity" />
    </id>
    <set name="orderItems" inverse="true" cascade="all">
        <key>
            <column name="id_order" not-null="true" />
        </key>
        <one-to-many class="hibernate.OrderItem" />
    </set>
</class>

クラスオーダー

public class Order  implements java.io.Serializable {

     private Integer idOrder;
     private Set<OrderItem> orderItems = new HashSet<OrderItem>(0);

}

ここにOrderItem.hbm.xmlがあります

<class name="hibernate.OrderItem" table="order_item" catalog="my">
    <id name="idOrderItem" type="java.lang.Integer">
        <column name="id_order_item" />
        <generator class="identity" />
    </id>
    <many-to-one name="order" class="hibernate.Order" fetch="select">
        <column name="id_order" not-null="true" />
    </many-to-one>
</class>

クラスOrderItem

public class OrderItem  implements java.io.Serializable {

     private Integer idOrderItem;
     private Order order;

}

保存しようとすると、例外がスローされます。

object references an unsaved transient instance - save the transient instance before flushing: hibernate.Order

編集: 次のステートメントで動作します。これは正しいです?

Order order = mapper.map(dtoOrder, Order.class);

Set<OrderItem> orderItems = order.getOrderItems();
for (OrderItem orderItem : orderItems) {
    orderItem.setOrder(order);
}
order.setOrderItems(orderItems);

session.save(order);
4

1 に答える 1

1

したがって、基本的にここには3つの回避策があります。

1. OrderItem ではなく Order を保存します。これは、現在の休止状態の構成に関して、カスケードが Order から OrderItem に移動するためです。

2. OrderItem.hbm.xml に cascade=save-update を設定し、OrderItem を保存すると、Order が自動的に保存されます。しかし、これは推奨されません。

3.何らかの理由で、OrderItem を保存することを主張し、休止状態の構成を変更したくない場合は、最初に明示的に Order を保存してから、session.flush() を呼び出して、OrderItem を保存する前に永続的な Order インスタンスを取得する必要があります。 ;

これが理にかなっていることを願っています。

于 2013-02-16T02:59:18.473 に答える