gpt4 book ai didi

grails - 域方法中设置的Grails 3.3.10值未保存

转载 作者:行者123 更新时间:2023-12-02 15:03:29 26 4
gpt4 key购买 nike

我有一个带有resetPasswordToken属性的User类,这是在用户尝试重置其密码时设置的UUID。

在Grails 2.5.6上,我有类似的东西可以正常工作:

class UserController {


def forgotPassword(String email)
{
...
def user = User.findByEmail(email)
user.setPasswordToken()
user.save(flush: true()
...
}
}

class User {

...
String resetPasswordToken

static transients = ['passwordToken']

def setPasswordToken()
{
...
this.resetPasswordToken = (java.util.UUID.randomUUID() as String)
}
}

现在,我将其迁移到GRails 3.3.10,并且在调用了gotgotPassword操作之后,数据库上的resetPasswordToken为NULL。如果在调用user.setPasswordToken()之后执行println,则可以看到resetPasswordToken设置为UUID,但不在数据库中。还要检查保存是否有错误,并且没有错误。

奇怪的是,如果我在 Controller 中执行 user.resetPasswordToken =“xxxx” ,则该值将正确保存到数据库中。

不知道怎么回事setPasswordToken()中设置的值没有保存到数据库中。有指针吗?

最佳答案

请参阅https://github.com/grails/grails-data-mapping/issues/961#issuecomment-309379214上的注释。您遇到的问题是脏检查之一,已在GORM 6.1中进行了更改。

考虑这段代码...

class Person {
String name
String email

void updateName(String newName) {
this.name = newName
}

static constraints = {
email email: true
}
}

updateName方法不会导致 name属性被标记为脏。以下代码将导致 name属性被标记为脏:
class Person {
String name
String email

void updateName(String newName) {
setName newName
}

static constraints = {
email email: true
}
}

如果您真的想打开旧的脏检查方式,则可以按照上面我链接的注释中的说明进行操作,但要注意这样做会降低性能。推荐的方法是使用setter或使用 markDirty方法将属性显式标记为脏。

希望对您有所帮助。

关于grails - 域方法中设置的Grails 3.3.10值未保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58480441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com