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

org.hibernate.HibernateException Message reassociated object has dirty collection

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

  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()
    

此时我们得到如下异常:

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

有没有办法阻止这种情况的发生,以便我可以重新附加对象并保存它,从而使对产品收益集合的更改持久化?

不要将对象存储在会话中,存储 ID,然后重新加载它。 attach 无论如何都会产生该成本,因此您没有节省任何东西,并导致此问题,加上浪费服务器内存,这将影响可伸缩性。