1
我有一個簡單的表單,打算更新購物車中的物品列表。 表單工作得很好,我在 購物車中顯示每個項目的輸入文字。但是,如果我更改項目文本,然後保存,它失敗的 休眠錯誤: 的PersistenceException發生: org.hibernate.PersistentObjectException:獨立實體傳遞給 堅持:models.Item更新@OneToMany在Play框架
這裏是形式:
<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();
}
我認爲這是一個常見的情況,但我不知道這樣做的 正確的方法。
謝謝您的回答勒布之前合併的實體。我已經嘗試過merge(),但在這種情況下,我的項目不會與新值一起保存。實際上,這似乎是Play的一個已知問題。我今天發現這個類似的問題:[錯誤:分離的實體傳遞給持久化 - 嘗試持久複雜的數據(Play-Framework)](http://stackoverflow.com/questions/7986970/error-detached-entity-passed-對一直存在,試圖對堅持複雜的數據播放-FRA)。 – budgw