Grails 保存操作的奇怪行为

Grails 保存操作的奇怪行为,grails,Grails,我在保存域时有一个奇怪的行为,下面是域: class Ads { String adTitle String adDetails String duration Date dateCreated static belongsTo = [user:Users] static constraints = { category (nullable:false) adTitle (nullable:false, maxSize:100 ) adDetails(nullable

我在保存域时有一个奇怪的行为,下面是域:

class Ads {
String adTitle
String adDetails
String duration
Date dateCreated

static belongsTo = [user:Users]

static constraints = {
    category (nullable:false)
    adTitle (nullable:false, maxSize:100 )
    adDetails(nullable:false, maxSize:500 )
    duration (inList:["7 days", "14 days", "30 days"],nullable:true)
}

static mapping ={ duration (sqlType:"datetime") }
}
以下是控制器中的保存操作

    @Transactional
def save(Ads adsInstance) {
    if (adsInstance == null) {
        notFound()
        return
    }

    if (adsInstance.hasErrors()) {
        respond adsInstance.errors, view:'create'
        return
    }
    adsInstance.user=Users.get(springSecurityService.currentUserId)

    def adCreationDate = new Date()

    switch (adsInstance.duration) {//here i'm just modifying the duration 
        case "7 days":
            adsInstance.duration=adCreationDate+7

            break
        case "14 days":
            adsInstance.duration=adCreationDate+14

            break
        case "30 days":
            adsInstance.duration=adCreationDate+30

            break
        default:
            adsInstance.duration=adCreationDate+7

    }
    adsInstance.save flush:true
    if (adsInstance.isAttached()) //here the return is always not saved
    {
        println "Saved"
    }
    else
    {
        println " not Saved"
    }
    request.withFormat {
        form multipartForm {
            flash.message = message(code: 'default.created.message', args: [
                message(code: 'ads.label', default: 'Ads'),
                adsInstance.id
            ])
            //  redirect adsInstance
            redirect action:'show' ,id:adsInstance.id
        }
        '*' { respond adsInstance, [status: CREATED] }
    }
}

adsInstance.isAttached()中,我总是得到未保存的,尽管adsInstance.save flush:true在它之前被调用,我是否遗漏了什么?

您遗漏了两件事:

  • 修改持续时间字段后,将不再验证对象
  • 如果您使用save方法添加了
    failOnError:true
    ,您自己就会发现问题

您在
持续时间
字段中添加了一个约束,该字段只能包含值
[“7天”、“14天”、“30天”]
。但在开关块内部,您为其指定的日期类型值将无法通过验证。其次,根据验证,
duration
字段的sql类型不应该是
datetime
。您应该创建一个自定义validatior或使用一个临时字段。

好的,我知道了,但是我如何做,用户可以从列表中选择“7,14,30天”,我将他的选择保存为数据库中的一个日期?添加
[“7天”,“14天”,“30天”]
对瞬态字段的约束,然后从瞬态字段值中为
持续时间
字段制定值。那么我如何跳过对该字段的验证?从持续时间字段中删除约束,并将其添加到新的瞬态字段中。将持续时间字段的数据类型从字符串更改为日期。我找到了跳过验证的方法,但这将跳过所有字段的验证,
save(validate:false)