Grails,save donds';在服务中更新对象时不保存
拥有一个从服务操作的域,然后尝试保存,但即使我使用:Grails,save donds';在服务中更新对象时不保存,grails,gorm,Grails,Gorm,拥有一个从服务操作的域,然后尝试保存,但即使我使用:save(flush:true,failOnError:true)和validate()返回true,而hasrerrors()返回false 我从bootstrap打电话: def timeKeeperService def init = { servletContext -> def TimeKeeper tk = TimeKeeper.findByName('MAIN')?:new TimeKeeper(name:'MAIN
save(flush:true,failOnError:true)
和validate()
返回true,而hasrerrors()返回false
我从bootstrap打电话:
def timeKeeperService
def init = { servletContext ->
def TimeKeeper tk = TimeKeeper.findByName('MAIN')?:new TimeKeeper(name:'MAIN').save(flush:true, failOnError:true)
tk = timeKeeperService.initialize()
tk = timeKeeperService.workStart()
域:
class TimeKeeper {
String name
Date dateCreated
Date dateUpdated
Date workStart
Date workEnd
def initialize() {
println("TimeKeeper initialize...")
workStart = null
workEnd = null
}
def workStart() {
if (workStart == null) {
println("TimeKeeper - workStart")
workEnd = null
workStart = new Date()
} else {
}
println("TimeKeeper - workStart: "+workStart)
}
def workEnd() {
if (workEnd == null) {
workStart = null
workEnd = new Date()
} else {
}
}
def beforeInsert() {
dateCreated = new Date()
dateUpdated = new Date()
println("TimeKeeper - beforeInsert workStart: "+workStart)
}
def beforeUpdate() {
println("TimeKeeper - beforeUpdate workStart: "+workStart)
dateUpdated = new Date()
}
static constraints = {
dateCreated nullable:true
workStart nullable:true
workEnd nullable:true
}
}
服务:
@Transactional
class TimeKeeperService {
def TimeKeeper getTimeKeeper() {
TimeKeeper.findByName('MAIN')
}
def TimeKeeper initialize() {
def TimeKeeper TK = getTimeKeeper()
TK.initialize()
// def s = TK.save(flush:true)
// println("TimeKeeperService - initialize - save: "+s )
return TK
}
def TimeKeeper workStart() {
def TimeKeeper TK = getTimeKeeper()
TK.workStart()
println("TimeKeeperService - validate workStart: "+TK.validate())
// TK.save(flush:true, failOnError: true)
println("TimeKeeperService - workStart: "+TK.workStart+" Errors: "+TK.hasErrors())
return TK
}
当从引导创建对象时,它工作-对象被创建并保存。
但是服务方法initialize
和workStart
不会保存,即使我进行了以下操作:
tk.save(flush:true, failOnError:true)
在引导中
但是如果我在引导中设置属性,然后调用save,它就会工作
tk.workStart = new Date()
tk.save(flush:true, failOnError: true)
我已经为此奋斗了几个小时,但没有成功。因此,如果我能得到一些帮助来解决这个问题,我将非常高兴。我在Grails3.3.0中遇到了同样的问题。对域内方法的调用不会使实例变为脏实例。对于一个解决方案,我尝试在控制器中设置值,它从那里开始工作:(
如果进行调试,您可能会看到,该值已更改,但该实例未更新,因为hibernate未发现它是脏的
我怀疑这是Grails3.3.0中的一个bug
我有gradle属性-
grailsVersion=3.3.0
gormVersion=6.1.6.RELEASE
gradleWrapperVersion=3.5
我发现您的服务方法代码中存在一些问题-
def TimeKeeper initialize() {
def TimeKeeper TK = getTimeKeeper()
TK.initialize()
// def s = TK.save(flush:true)
// println("TimeKeeperService - initialize - save: "+s )
return TK
}
似乎会递归调用此方法,而不会随时调用save。很可能您的服务方法返回null,而不是您希望它返回的计时器
def TimeKeeper getTimeKeeper() {
TimeKeeper.findByName('MAIN')
}
如果在给定的约束条件下找不到计时器,那么这个will方法将简单地返回null
我将修改此方法,以保证返回计时器
def TimeKeeper getTimeKeeper() {
TimeKeeper.findOrCreateByName('MAIN')
}
使用
在你的应用程序.yml
版本的Grails?版本是:3.3.0你的服务是跨国注释的,如果有什么问题,它会回滚trsanAction(不会保存数据),尝试使用临时注释@Transactional,但没有帮助。我调用了validate()但是没有什么错误,它返回了true,所以肯定还有其他错误。它可能很简单,但我看不到。不,它总是返回对象,我将时间值记录在TimeKeeper中,并且时间总是以正确的时间更新。保存也会返回具有正确值的对象,但对象永远不会被保存不,是计时器初始化,而不是TimeKepperService.initialize。如果它是递归的,它应该会使应用程序崩溃。我有相同的版本-和相同的体验。但是如果它是一个bug-奇怪的是,没有其他人声称这一点。你有更多的调查吗?没有,目前我被卡住了。Bu我可以补充一个事实,在这些情况下,TimeKeepers beforeUpdate方法从未被调用。当您在控制器或引导程序中进行保存时,它会被调用。我爱您,devdb,您这个美丽的人。在看到您的响应(在grails 3.3.6上)之前,我已经撕了好几个小时的头发。谢谢!
hibernate:
flush:
mode: AUTO