org.hibernate.HibernateException消息重新关联的对象具有脏集合

时间:2015-01-29 13:37:51

标签: session grails gorm

我有一个执行以下步骤的应用程序:

  1. 在会话中放置对象:

    def product = Product.get(1)
    session["product"] = product
    
  2. 执行和Ajax调用以更新1-m关系,然后呈现显示新优势的部分模板。这些不应该保存,因为用户可能会改变主意,因此称为丢弃:

    def product = session["product"]
    
    if ( !product.isAttached() ) {
       product.attach()
    }
    
    product.addToBenefits( new Benefit( title: "xx" ) )
    
    product.discard()
    
    session["product"] = product
    
  3. 尝试在保存操作中保存对象。

    def product = session["product"]
    
    if ( !product.isAttached() ) {
         product.attach()
    }
    product.save()
    
  4. 此时我们得到以下异常:

    org.springframework.orm.hibernate3.HibernateSystemException: reassociated object has dirty collection; nested exception is org.hibernate.HibernateException: reassociated object has dirty collection
    

    无论如何都要阻止这种情况发生,以便我可以重新附加对象并保存它,从而持续更改产品权益集合?

1 个答案:

答案 0 :(得分:1)

不要将对象存储在会话中,存储id,然后重新加载它。您使用attach无论如何都会产生这笔费用,因此您不会保存任何内容,并导致此问题,加上浪费服务器内存,这会影响可扩展性。