使用Grails/GORM清除并恢复夹具数据

使用Grails/GORM清除并恢复夹具数据,grails,gorm,Grails,Gorm,我需要根据控制器请求重置GORM夹具数据(H2)。所以我创建了以下控制器 def dataSource FixtureLoader fixtureLoader def index() { Sql sql = new Sql(dataSource) sql.execute("DROP ALL OBJECTS DELETE FILES") sql.close() fixtureLoader.load('f1','f2','f3') } 我希望这会清除数据库,但是,我

我需要根据控制器请求重置GORM夹具数据(H2)。所以我创建了以下控制器

def dataSource
FixtureLoader fixtureLoader
def index() {
    Sql sql = new Sql(dataSource)
    sql.execute("DROP ALL OBJECTS DELETE FILES")
    sql.close()
    fixtureLoader.load('f1','f2','f3')
}
我希望这会清除数据库,但是,我仍然得到以下错误

[org.codehaus.groovy.grails.web.errors.GrailExceptionResolver] 处理请求[GET]时发生UnuniqueObjectException 已创建具有相同标识符值的不同对象 与会话关联:[*]。跟踪如下: org.hibernate.unUniqueObjectException:具有 相同的标识符值已与会话关联:[*]

另一件奇怪的事情是,如果我进入dbconsole并使用“dropall OBJECTS DELETE FILES”命令将所有内容清除,当我进入控制器时,我会得到相同的错误。即使我可以确认它们已从数据库中删除

更新

所以我尝试了一些事情

1.“删除所有对象删除文件”似乎在dbconsole中按预期工作。但是代码

    Sql sql = new Sql(dataSource)
    sql.execute("DROP ALL OBJECTS DELETE FILES")
    sql.close()
似乎没有同样的效果

2.)我添加了以下几行

def sessionFactory
...
sql.close()
sessionFactory.currentSession.flush() //This one  
fixtureLoader.load('f1','f2','f3')

然后我在DB控制台中进行删除(因为SQL似乎失败了),然后运行。但是,当我再次运行该函数时,我仍然可以看到装置。

为此,我基本上与


在我的引导程序中,我创建了tmp文件,然后当调用控制器时,我将其作为脚本运行,所有内容都会重置。我还必须确保根据注释删除了缓存。

听起来好像hibernate会话/缓存没有被刷新/清除,因此即使您更改了数据存储,也会认为存在重复。您可能有幸在测试环境中禁用了hibernate缓存。这是我认为close所做的,我也尝试了sql.execute(“删除所有对象删除文件”),请查看我的更新,我是否未能正确清除缓存?您缺少了一个基本的难题。即使执行SQL语句“吹走”所有数据,Hibernate仍然存在于典型的Grails应用程序中,默认情况下,它有自己的缓存,独立于数据库。当您在不经过Hibernate的情况下更改数据库时,您就绕过了Hibernate管理缓存的能力,因此在这种情况下,当数据不存在时,Hibernate仍然认为它存在。考虑清除或禁用Hibernate cahce(如果对应用程序有意义的话),或使用Hibernate进行核爆。
session.flush()
不会起任何作用,因为您没有使用Hibernate会话来影响数据库。所以,不,这是不对的。