【问题标题】:Grails, save doesn't save when objects is updated in a serviceGrails,在服务中更新对象时保存不保存
【发布时间】:2017-11-20 09:41:45
【问题描述】:

拥有一个从服务中操作的域,然后尝试保存它,即使我使用以下方法也不起作用: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()

领域:

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) 

在引导程序中。

但是如果我在 bootstrap 中设置属性然后调用 save 就可以了。

    tk.workStart = new Date()
    tk.save(flush:true, failOnError: true)

我已经为此苦苦挣扎了几个小时,但没有成功。所以如果我能得到一些帮助来解决这个问题,我会很高兴的。

【问题讨论】:

  • Grails 的版本?
  • 版本为:3.3.0
  • 你的服务是跨国注释的,如果有问题它会回滚 trsansaction(不会保存数据),尝试临时评论@Transactional
  • 我对此进行了测试,但没有帮助。我调用了 validate() 但没有错,它返回了 true,所以肯定还有其他问题。这可能很简单,但我看不到。

标签: grails grails-orm


【解决方案1】:

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

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

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

我有 gradle 属性 -

grailsVersion=3.3.0
gormVersion=6.1.6.RELEASE
gradleWrapperVersion=3.5

【讨论】:

  • 我有相同的版本 - 和相同的体验。但如果这是一个错误——奇怪的是没有其他人这么说。
  • 你还有什么调查吗?
  • 不,目前我被困住了。但我可以补充一点,在这些情况下永远不会调用 TimeKeepers beforeUpdate 方法。当您在控制器或引导程序中进行保存时会调用它。
  • 我爱你 devdb,你这个美丽的人。在看到您的回复之前,我已经扯了几个小时的头发(在 grails 3.3.6 上)。谢谢!
【解决方案2】:

我在您的服务方法代码中发现了一些问题 -

def TimeKeeper initialize() {
    def TimeKeeper TK = getTimeKeeper()
    TK.initialize()
//    def s = TK.save(flush:true)
//    println("TimeKeeperService - initialize - save: "+s )
   return TK
}

看来这个方法会被递归调用,而不会随时调用 save。

【讨论】:

  • 不,它是计时员初始化,而不是 TimeKepperService.initialize。如果它是递归的,它应该会使应用程序崩溃。
【解决方案3】:

您的服务方法很可能返回 null 而不是您期望它返回的 TimeKeeper

    def TimeKeeper getTimeKeeper() {
        TimeKeeper.findByName('MAIN')
    }

如果在给定约束条件下找不到 TimeKeeper,此 will 方法将简单地返回 null。

我会修改这个方法,以保证它返回一个 TimeKeeper

def TimeKeeper getTimeKeeper() {
        TimeKeeper.findOrCreateByName('MAIN')
    }

【讨论】:

  • 不,它总是返回对象,我在 TimeKeeper 中记录了时间值,并且时间总是用正确的时间更新。保存还返回具有正确值的对象,但该对象永远不会保存到数据库中。
【解决方案4】:

使用

hibernate:
    flush:
        mode: AUTO

在你的application.yml

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 2018-01-22
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多