我的 grails 项目面临错误 "TransactionRequiredException:no transaction" 使用 domain.save(flush:true).save() 它可以保存但更新

My grails project facing error"TransactionRequiredException:no transaction" using domain.save(flush:true).save() it can is saving but updating

package com.fhjony.ocbt


import grails.web.servlet.mvc.GrailsParameterMap


class MemberService {

def save(GrailsParameterMap params) {
    Member member = new Member(params)
    def response = AppUtil.saveResponse(false, member)
    if (member.validate()) {
        member.save(true)
        if (!member.hasErrors()){
            response.isSuccess = true
        }
    }
    return response
}


def update(Member member, GrailsParameterMap params) {

    member.properties = params
    def response = AppUtil.saveResponse(false, member)
    if (member.validate()) {
        member.save(flush: true)
        if (!member.hasErrors()){
            response.isSuccess = true
        }
    }
    return response
}


def getById(Serializable id) {
    return Member.get(id)
}


def list(GrailsParameterMap params) {
    params.max = params.max ?: GlobalConfig.itemPerPage()
    List<Member> memberList = Member.createCriteria().list(params) {
        if (params?.colName && params?.colValue) {
            like(params.colName, "%" + params.colValue + "%")
        }
        if (!params.sort) {
            order("id", "desc")
        }
    }
    return [list: memberList, count: memberList.totalCount]
}


def delete(Member member) {
    try {

        member.delete(flush: true,failOnError:true)
    } catch (Exception e) {
        println(e.getMessage())
        return false
    }
    return true
}
}

错误信息:

URI /member/update Class
javax.persistence.TransactionRequiredException Message null Caused by
no transaction is in progress
     Line | Method
 ->>  211 | invoke           in org.grails.core.DefaultGrailsControllerClass$ReflectionInvoker
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  |    188 | invoke           in org.grails.core.DefaultGrailsControllerClass |     90 | handle . . . .
 . in org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter |   1039
 | doDispatch       in
 org.springframework.web.servlet.DispatcherServlet |    942 | doService
 . . .  in     '' |   1005 | processRequest   in
 org.springframework.web.servlet.FrameworkServlet |    908 | doPost . .
 . . . in     '' |    882 | service          in     '' |     77 |
 doFilterInternal in

您希望数据库交互发生在事务上下文中。其中一个简单的部分是您可以将您的服务 class 标记为 @grails.gorm.transactions.Transactional.

与此分开,这与您的问题并没有真正的关系,但是将 GrailsParameterMap 映射作为方法参数传递是一件不寻常的事情。正确的做法取决于您应用程序中的某些因素,您可能希望将值传递给您的服务而不是整个地图,但如果您真的想要服务中的整个地图,一种方法是通过WebAttributes.

import grails.gorm.transactions.Transactional
import grails.web.api.WebAttributes

@Transactional
class MemberService implements WebAttributes {

    def serviceMethod() {
        // you can access params here because 
        // WebAttributes provides access to it
        Member member = new Member(params)

        // ...
    }
}