gpt4 book ai didi

Grails 自定义验证 - 内部验证检查查询 - 更新时会发生什么?

转载 作者:行者123 更新时间:2023-12-04 18:52:52 27 4
gpt4 key购买 nike

我有一个自定义验证器,例如 -

validator: { userEmail, userAccount ->

if (userAccount.authenticationChannel == "ABC") {
boolean valid = true;
UserAccount.withNewSession {
if (UserAccount.findByEmail(userEmail)){
valid = false;
}
else if (UserAccount.findByName(userEmail)) {
valid = false;
}

...

所以基本上,我需要一些基于某些条件的验证,在我的验证中我需要执行一个查询。

但是,现在如果我这样做——
def admin = new UserAccount(firstname:'Admin',email:'admin@example.com')


admin.save(flush:true)


admin.addToAuthorities("ADMIN").save(flush:true)

它失败。

Grails 正在运行验证,即使在更新时也是如此,并且由于电子邮件存在验证失败。如果我这样做有什么不同
email {unique:true}
Grails 是说我不能编写一个检查唯一性的自定义验证器。

最佳答案

不确定这是否是您的问题,但是当我尝试创建这样的验证(即对数据库进行查询的验证)时,我会收到 StackOverflowError。原因是,当您运行查询(如 findByEmail )时,Hibernate 将尝试刷新 session ,这将导致它验证所有 transient 对象,进而再次调用您的自定义验证器,从而导致无限递归。

防止这种情况的技巧是在运行查询时将 session 的刷新模式设置为“手动”一段时间。这可以防止 Hibernate 在运行查询之前尝试刷新 session 。副作用是您的查询不会返回您在当前 session 中创建但尚未持久化(刷新)回数据库的实体。

UserAccount.withNewSession { session ->
session.flushMode = FlushMode.MANUAL
try {
if (UserAccount.findByEmail(userEmail)){
valid = false;
}
else if (UserAccount.findByName(userEmail)) {
valid = false;
}
}
finally {
session.setFlushMode(FlushMode.AUTO);
}
}

UniqueConstraint有关如何完成此操作的示例。

关于Grails 自定义验证 - 内部验证检查查询 - 更新时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3447612/

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