Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止Hibernate在使用GORM传递到服务时持久化对象_Hibernate_Grails_Gorm - Fatal编程技术网

如何防止Hibernate在使用GORM传递到服务时持久化对象

如何防止Hibernate在使用GORM传递到服务时持久化对象,hibernate,grails,gorm,Hibernate,Grails,Gorm,我有一个控制器,在控制器内,我将域对象传递给服务以检查版本和一些其他逻辑。我的控制器/服务调用是message=service.updateExisting(domainObj、un、other) 当我在控制器中运行domainObj.version时,我得到的版本比在服务中运行时的版本低。此外,无论我在updateExisting方法中执行了哪些检查,更改都会被持久化 我还尝试过在Config.groovy中设置grails.gorm.autoFlush=false,在服务中设置def tra

我有一个控制器,在控制器内,我将域对象传递给服务以检查版本和一些其他逻辑。我的控制器/服务调用是
message=service.updateExisting(domainObj、un、other)

当我在控制器中运行domainObj.version时,我得到的版本比在服务中运行时的版本低。此外,无论我在updateExisting方法中执行了哪些检查,更改都会被持久化

我还尝试过在Config.groovy中设置
grails.gorm.autoFlush=false
,在服务中设置
def transactional=false
,这两种设置似乎都没有帮助。有人能看到我遗漏了什么吗


我还在控制器和服务中尝试了
static transactional=false

如果您只想在一种情况下阻止自动刷新,请尝试明确更改当前会话的刷新模式,然后在之后将其切换回自动

def sessionFactory //inject the service

def doSomethingWithoutFlushing(){
    sessionFactory.currentSession.setFlushMode(org.hibernate.FlushMode.MANUAL)
    def message = service.updateExisting(domainObj, un, other)
    sessionFactory.currentSession.setFlushMode(org.hibernate.FlushMode.AUTO)
}
我找到了答案。结果表明,控制器在调用持久化数据的服务时结束了其休眠会话。如果我做下面的事

domainObj.discard()
message = service.updateExisting(domainObj, un, other)

这对我来说有点违反直觉,因为我认为放弃也会放弃更改,但事实似乎并非如此。然后,我在服务中调用.save(),一切都会按预期的方式保持。感谢大家的帮助。

我将研究.read()方法,而不是使用.get()。(假设您当前正在使用.get()

这样,除非您在域上显式调用.save(),否则它不会保留更改,并且可能比在将对象传递给服务之前调用.discard()更好/更干净


在刚才查看文档时,我没有意识到,如果修改,对象上的任何集合仍然会自动保存。因此,根据对象的复杂性以及控制器操作中发生的其他情况,这可能对您有用,也可能对您没有用处。

控制器中是否有@Transactional?如果您可以添加更多关于控制器和服务的详细信息,这将更有帮助。我可以添加任何您需要的详细信息,只是两者都相当大。控制器上唯一的注释是@Log4j。Config.groovy中是否有其他属性可能导致此问题?我没有尝试过,但当它进入服务时版本仍然会上升。此外,我注意到,当我添加不遵守约束的值时,我在进入服务时会看到错误,但它是否会持续存在?根据您的问题,您真正的问题似乎是您保留了不需要的数据。如果您的版本总是增加1,您不能在代码中说明这一点吗?我没有使用.get(至少没有显式地)我使用的是自动连接的命令对象