grails中的Hibernate对象异常

grails中的Hibernate对象异常,hibernate,grails,constraints,Hibernate,Grails,Constraints,从grails webapp添加记录时,我遇到了一个UnonqueObjectException。之所以会发生这种情况,是因为webapp的用户能够添加记录,并且他们填写的字段之一是domain object/db表的PrimaryKey。Hibernate将在创建域对象(AFAIK)后立即检查数据库,以查看具有该ID的记录是否存在。因此,当发现冲突时,它会抛出此错误 我的第一反应是在用户不知道的对象上添加一个新的PK字段,例如GUID。虽然这适用于我们拥有的许多域对象,但我们也有一些指向无法更

从grails webapp添加记录时,我遇到了一个UnonqueObjectException。之所以会发生这种情况,是因为webapp的用户能够添加记录,并且他们填写的字段之一是domain object/db表的PrimaryKey。Hibernate将在创建域对象(AFAIK)后立即检查数据库,以查看具有该ID的记录是否存在。因此,当发现冲突时,它会抛出此错误

我的第一反应是在用户不知道的对象上添加一个新的PK字段,例如GUID。虽然这适用于我们拥有的许多域对象,但我们也有一些指向无法更改的遗留表的域对象。这使得为此目的添加列不切实际

我的下一个解决方案是检查用户传入webapp的ID,并检查该ID是否已经存在。如果存在,则传回一条亲切的消息,通知他们记录已经存在。此解决方案肯定会起作用,但与在域对象上具有所有约束的模型背道而驰。这也可以通过try/catch实现,以获得类似的结果

我的问题是,我可以推迟hibernate检查数据库中是否已经存在对象,直到节省时间吗?域对象上有一个唯一的约束,在节省时间时将违反此约束,并允许调用messages.properties消息。此外,任何其他想法将不胜感激

更新:


我在最初的帖子中犯了一个错误。调用save时抛出错误。然而,这指向一个不同的问题。域对象上的唯一约束似乎未被调用。域对象以某种方式通过了验证,即使“unique”是域ID的一部分。这是否意味着域对象ID字段上的约束“unique”的验证方式与在其他对象上的验证方式不同?

您看过grails域类中的onSave()方法了吗?也许这会有帮助。

如果不是在节省时间,现在什么时候抛出异常?呜呜,我犯了一个错误。调用save时会发生这种情况。我想这就是我通过在本地运行和在肩调试的基础上发表文章所得到的。我将更新帖子并重新表述问题。您是否使用save(flush:true)?仅当尝试提交事务(完成整个控制器操作后)或明确请求flush.def saved=domain.save(flush:true,failOnError:true)时,才会验证约束。它运行我创建的自定义验证器,因此,它必须是这样的逻辑。我将在我的基本SaveDomain方法中捕获ununiqueobjectexception,然后以这种方式处理它。我认为Grails中没有
onSave()
方法。