2011-11-23 83 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