在Play框架中更新@OneToMany

时间:2011-11-23 19:35:52

标签: jpa playframework one-to-many

我有一个简单的表单,打算更新购物车中的商品列表。 表单效果很好,我为每个项目显示输入文本 购物车。但是,如果我更改项目文本然后保存,则会失败 休眠错误: 发生PersistenceException: org.hibernate.PersistentObjectException:传递给的分离实体 坚持:models.Item

以下是表格:

<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 个答案:

答案 0 :(得分:1)

您必须在保存之前合并您的实体

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