Grails,在服务中更新对象时不会保存保存

lar*_*and 2 grails grails-orm

拥有一个从服务操纵的域,然后尝试保存该域不起作用,即使我使用:save(flush:true, failOnError:true)validate()返回 true 并hasErrors()返回 false。

我从引导程序进行调用:

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()
Run Code Online (Sandbox Code Playgroud)

域名:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

服务:

@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
   }
Run Code Online (Sandbox Code Playgroud)

当从引导程序创建对象时,它会起作用 - 创建并保存对象。但即使我做了以下操作,服务方法initializeworkStart不会保存:

tk.save(flush:true, failOnError:true) 
Run Code Online (Sandbox Code Playgroud)

在引导程序中。

但是如果我在引导程序中设置属性然后调用保存它就可以了。

    tk.workStart = new Date()
    tk.save(flush:true, failOnError: true)
Run Code Online (Sandbox Code Playgroud)

我为此奋斗了几个小时但没有成功。因此,如果我能得到一些帮助来解决这个问题,我会非常高兴。

dev*_*vbd 5

我在 Grails 3.3.0 中遇到了同样的问题。调用域内的方法不会使实例成为dirty. 对于解决方法,我尝试在控制器中设置值,它从那里开始工作:(

如果您调试,您可能会看到,值已更改,但实例未更新,因为 hibernate 未找到它dirty

我怀疑这是 Grails 3.3.0 中的一个错误

我有 gradle 属性 -

grailsVersion=3.3.0
gormVersion=6.1.6.RELEASE
gradleWrapperVersion=3.5
Run Code Online (Sandbox Code Playgroud)