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