gpt4 book ai didi

hibernate - 请求结束时 GORM 自动刷新而不调用保存

转载 作者:行者123 更新时间:2023-12-02 06:35:45 24 4
gpt4 key购买 nike

我准备了简单的 Controller 操作来测试与对数据库的意外提交更改相关的行为:

def testSimple() {
Product p = Product.findById(1);

p.name = "test doneee"

//p.save flush:true

respond p
}

即使未调用 save(),更改也会保留在数据库中。如何避免在不调用 save() 的情况下保存实体?

最佳答案

Grails 注册一个 OpenSessionInView 拦截器,它启动一个 Hibernate session 和每个请求的开始,并在请求结束时刷新和关闭它。这样做主要是为了允许延迟加载的一对多实例和多对一集合按需加载。一个副作用就是您所看到的,即使没有 save() 调用,更改持久实例也会导致更改被推送到数据库。这是因为更改它会将其标记为脏,并且 Hibernate 在刷新期间发现所有脏对象并将更改推送到数据库。

为避免持久化此类更改,请使用 http://grails.org/doc/latest/ref/Domain%20Classes/discard.html方法将其从 Session 中分离出来。

附注不相关,但您应该使用 get 而不是 findById,因为 get 做同样的事情但有更好的缓存行为。

关于hibernate - 请求结束时 GORM 自动刷新而不调用保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19617470/

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