misco
misco

Reputation: 1952

How to save parent with children?

I have parent entity Order with child entity OrderItem. I want to save object Order together with Set<OrderItem>, but idOrder is auto increment. Between Order and OrderItem is one-to-many relationship. OrderItem include reference to parent Order. So Order item must be saved firstly and then must be saved OrderItem with assigned idOrder.

Here is 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>

class Order

public class Order  implements java.io.Serializable {

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

}

Here is 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>

class OrderItem

public class OrderItem  implements java.io.Serializable {

     private Integer idOrderItem;
     private Order order;

}

When I try save it, it throw me exception.

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

EDIT: It works with following statement. Is this correct?

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

Upvotes: 0

Views: 5353

Answers (1)

spiritwalker
spiritwalker

Reputation: 2257

so basically there are 3 workarounds here.

1.Save Order rather than OrderItem, because regarding to your current hibernate configuration the cascading navigates from Order to OrderItem;

2.have a cascade=save-update in OrderItem.hbm.xml , and then saving an OrderItem will automatically save Order; but this is not recommented ;

3.for some reason,if you insist to save OrderItem and don't want to change your hibernate confiuraion, I'm afraid you have to explicitly save Order first and then invoke session.flush() to get Order instance persistent before saving OrderItem;

I hope this make sense.

Upvotes: 1

Related Questions