我需要在控制器请求上重置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.GrailsExceptionResolver] 处理请求时发生NonUniqueObjectException:[GET] 已经有一个具有相同标识符值的不同对象 与会话相关联:[*]。 Stacktrace如下: org.hibernate.NonUniqueObjectException:一个不同的对象 相同的标识符值已与会话关联:[*]
另一个奇怪的事情是,如果我进入dbconsole并使用' DROP ALL OBJECTS DELETE FILES'命令,当我去控制器时,我得到了同样的错误。即使我可以确认他们已经从数据库中消失了。
更新
所以我尝试了一些事情......
1。)' DROP ALL OBJECTS DELETE FILES'似乎在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似乎失败了),然后运行。但是,当我再次运行该功能时,我仍然可以看到灯具。
答案 0 :(得分:0)
为此,我基本上和accepted answer here ...
做了同样的事在我的Bootstrap中,我创建了tmp文件,然后在调用控制器时,我将其作为脚本运行,一切都被重置。我还必须确保根据评论删除缓存。