grails - 在Grails中删除对象的问题-缓慢,但仍未真正删除

这可能是菜鸟的错误,所以请原谅我。我在高处和低处寻找解决方案,但没有结果-因此,我想在此添加第一篇文章:-)

我有两个域类,一个称为Domain,一个称为Page。如下代码所示,域中有许多页面。

class Domain {
          ...
    static hasMany = [  pages : Page, ... ]
    static mapping = {
        pages lazy:true
    }
}

class Page {
    String identifier
    ...
    static belongsTo = [ domain : Domain ]
    static hasMany = [ ... ]
    static constraints = {
        identifier(blank:false, unique:'domain')
    }
    static mapping = {
        ...
        domain lazy:true
    }
}

我的应用程序有一个很长的算法,可以在域上创建页面。如果您使用与上一次运行相同的参数运行算法,则将从删除上一次运行创建的所有页面开始,然后再次运行该算法。

我有两个问题:

问题1
当我使用以下方法从域中删除特定页面时:
def domain = page.domain
domain.removeFromPages(page);
page.delete()
domain.save(flush:true)

这导致Hibernate提取并加载域的所有页面,最终触发了数千个查询(该域有许多页面)。我该如何提高性能? -直接执行sql删除页面会使数据库和休眠状态不同步。

问题二
当我稍后再次创建页面时:
def page = new Page(identifier:'...').save(failOnError:true)

我得到:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session

欢迎任何帮助-我在这里迷失了方向:-/

最佳答案

我建议考虑对您的类(class)进行重新设计。
首先,从“域”中删除页面集合

Class Domain {
  // no pages here
}

然后在“页面”中简单引用“域”
Class Page {    
    String identifier
    Domain domain
    ...
}

这样可以更轻松地处理页面。
我不知道这是否真的适合您,因为您必须对现有代码进行更改,但这可以为您的大型集合省去很多麻烦。关于此还有一个presentation by Burt Beckwith。

https://stackoverflow.com/questions/7020732/

相关文章:

grails - 为什么Save无法在Grails中使用模拟域?

grails - 在Grails中使 session 无效

data-binding - Grails 绑定(bind)集合枚举

hibernate - 如何在grails中保存具有hasOne和belongsTo关系的对象

grails - 将Grails 1.3.7与EclipseLink 2.2.0 JPA Provi

grails - 在对象已经与该类持久化之后修改该类

grails - 当用户将表单字段留空时,使用正确的参数重新渲染 View 时出现问题

grails - Spring Security UI,有关其他补充表单/UI插件的推荐

hibernate - Grails级联删除?

grails - 在Grails的Jasper中将集合用作参数