gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:47:00 28 4
gpt4 key购买 nike

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

我有两个域类,一个称为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

关于grails - 在Grails中删除对象的问题-缓慢,但仍未真正删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7020732/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com