Hibernate 为什么Grails在instance save()上发出SELECT语句?

Hibernate 为什么Grails在instance save()上发出SELECT语句?,hibernate,grails,optimization,query-optimization,Hibernate,Grails,Optimization,Query Optimization,每次在Grails中保存()一个新的域对象时,我都会看到Hibernate为Grails域类中的每个唯一约束发出Select语句 如果未经验证而保存,则不会看到Select语句。例如: newperson(名称:'Foo')。保存(验证:false) 在仍然启用验证的情况下,是否有方法阻止这些额外的Select语句发生? 我的目标之一是减少appserver/数据库聊天次数,因为我希望我的Grails应用程序运行在高延迟网络上(例如,从Grails应用程序=>DB进行通信可能代价高昂) 伯特有

每次在Grails中保存()一个新的域对象时,我都会看到Hibernate为Grails域类中的每个唯一约束发出Select语句

如果未经验证而保存,则不会看到Select语句。例如:

newperson(名称:'Foo')。保存(验证:false)

在仍然启用验证的情况下,是否有方法阻止这些额外的Select语句发生?

我的目标之一是减少appserver/数据库聊天次数,因为我希望我的Grails应用程序运行在高延迟网络上(例如,从Grails应用程序=>DB进行通信可能代价高昂)

伯特有一个建议,但我希望有更简单/更干净的建议:

这可能是一个Hibernate问题,而不是Grails问题。我不确定

可能还有其他相关信息:


希望您现在了解它为什么会进行这些选择。验证是确定您的唯一约束字段是否确实是唯一的,并且不使用插入失败来进行验证,因为这不允许Grails响应哪个字段失败。@BillJames right,我在发布后开始意识到这一点。然而,我希望自己解析SQL错误消息(DB constraint name=>Grails字段,可能的话不确定),并将异常作为Grails ValidationException重新抛出。让我知道,如果你能想出一个方法以外的伯特的停止这些选择。我不想求助于猴子修补,但也许是最后的办法。:)嗯,不,我不知道如何更改唯一约束的功能。。。如果不想让它完成任务,就必须停止使用它。Grails约束应该能够在DB上插入或更新对象之前验证该对象。对于唯一约束,唯一的方法是发出查询以检查是否已经存在冲突记录。您可以查看唯一约束的源代码。如果这不是您想要的,那么您可能需要定义自己的约束,该约束将删除select和/或add客户机代码,以处理数据库中出现的唯一密钥异常。您可能需要研究Hibernate在这方面提供的选项。