2011-11-23 72 views
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(); 
} 

我認爲這是一個常見的情況,但我不知道這樣做的 正確的方法。

回答

1

你必須將其保存

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

謝謝您的回答勒布之前合併的實體。我已經嘗試過merge(),但在這種情況下,我的項目不會與新值一起保存。實際上,這似乎是Play的一個已知問題。我今天發現這個類似的問題:[錯誤:分離的實體傳遞給持久化 - 嘗試持久複雜的數據(Play-Framework)](http://stackoverflow.com/questions/7986970/error-detached-entity-passed-對一直存在,試圖對堅持複雜的數據播放-FRA)。 – budgw