grails插入到DB而不保存,为什么?

gra*_*s0r 1 grails save

我在Grails中发现了一些奇怪的东西.

我创建了一个对象:

User a = new User()
a.setName("test")
a.save()
Run Code Online (Sandbox Code Playgroud)

之后我调用一个方法,例如setActive,如:

a.setActive(true)
Run Code Online (Sandbox Code Playgroud)

并且不要调用save()但它保存在数据库中.我不知道为什么?!我觉得这很危险.有什么建议吗?

非常感谢,

马尔科

Bur*_*ith 6

Grails注册了一个"OpenSessionInView"拦截器,它在每个请求开始时打开一个Hibernate会话,并在完成后刷新并关闭它.这主要适用于延迟加载的集合.如果没有打开的会话,在加载实例后它会立即断开连接,因此尝试访问集合会引发异常.通过保持会话处于活动状态,可以解析集合.

默认情况下,Hibernate会在刷新期间自动推送持久化实例中的更改,因此,由于OSIV拦截器在请求结束时刷新,因此任何"脏"实例(如User实例)都会将其更改推送到数据库.

要解决此问题,您可以使用该read()方法加载现有实例,如果您只想暂时修改它,例如在GSP中进行渲染,但不希望更改自动保留.

这不适用于你的情况,因为你没有得到一个旧的实例,你正在创建它.在你的情况下,只需a.discard()在保存后调用,这将使它与Hibernate会话断开连接,并且当刷新发生时,Hibernate将没有任何东西可以推送.