从grails webapp添加记录时,我收到NonUniqueObjectException。发生这种情况是因为webapp的用户能够添加记录,并且他们填写的一个字段是域对象/ db表的PrimaryKey。一旦创建域对象(AFAIK),Hibernate将检查数据库以查看具有该ID的记录是否存在。因此,当它发现冲突时会抛出此错误。
我的第一反应是在用户不知道的对象上添加一个新的PK字段,例如GUID。虽然这适用于我们拥有的许多域对象,但我们还有一些域对象指向无法更改的旧表。这使得添加一个不适合此目的的列。
我的下一个解决方案是检查用户传入webapp的ID并检查是否已存在。如果存在,则传回一条消息,通知他们该记录已存在。这个解决方案肯定会起作用,但违背了对域对象拥有所有约束的模型。这也可以在try / catch中完成,以获得类似的结果。
我的问题是,我可以推迟hibernate检查数据库中是否已存在某个对象,直到节省时间为止?域对象对其具有唯一约束,并且在保存时违反此约束并允许调用messages.properties消息。此外,任何其他想法将不胜感激。
更新:
我在最初的帖子中犯了一个错误。调用save时会抛出错误。但是,这指向了另一个问题。似乎没有调用域对象的唯一约束。域对象以某种方式通过验证,即使“唯一”是域ID的一部分。这是否意味着域对象的ID字段上的“唯一”约束的验证方式与在其他对象上验证的方式相同?
答案 0 :(得分:0)
你有没有看过grails Domain Classes中的onSave()方法?也许这可以帮助。