обновление @OneToMany в игровых рамках - PullRequest
1 голос
/ 23 ноября 2011

У меня есть простая форма, предназначенная для обновления списка товаров в корзине. Форма работает довольно хорошо, я отображаю входной текст для каждого элемента в Корзина. Но если я изменю текст элемента, а затем сохраню, произойдет сбой с ошибка гибернации: Возникновение исключительной ситуации: org.hibernate.PersistentObjectException: отдельная сущность передана сохраняются: модели. Пункт

Вот форма:

<section class="form">
    #{form @save()}
        <input type="hidden" name="cart.id" value="${cart?.id}">

        <p class="field">
            <label for="title">Title :</label>
            <input type="text" name="cart.title" value="${cart?.title}"
            maxlength="50" size="50"/>
            <span class="error">${errors.forKey('cart.title')}</span>
        </p>

        <div id="items">
            #{if cart && cart.items}
                            #{list items:cart.items, as:'item'}
                                    <input type="hidden" name="cart.items[${item_index}].id" value="${item?.id}">
                                    <input type="text"    name="cart.items[${item_index}].text" value="$
{item?.text}"/>
                        #{/list}
                    #{/if}
        </div>

        <p class="buttons">
            <a href="@{index()}">Cancel</a> <input type="submit" value="Save" id="savecart">
        </p>
    #{/form}
</section>

Мои сущности и контролер:

@Entity
public class Cart extends Model {
    @Required
    public String title;

    @OneToMany(mappedBy = "cart", cascade = CascadeType.ALL)
    public List<Item> items;

    public Cart(String title) {
            this.title = title;
            this.items = new ArrayList<Item>();
    }
}


@Entity
public class Item extends Model {
    @Required
    public String text;

    @ManyToOne
    @Required
    public Cart cart;

    public Item(String text, Cart cart) {
            this.text = text;
            this.cart = cart;
    }

}

public static void save(Cart cart){
    validation.valid(cart);
            if (validation.hasErrors()) {
                    validation.keep();
                    formCart(cart.id);
            }
            cart.save();
            index();
} 

Я думаю, что это общий случай использования, однако я не уверен, что правильно.

1 Ответ

1 голос
/ 24 ноября 2011

Вы должны объединить свою сущность перед ее сохранением

cart = cart.merge();
cart.save();
...