假设:
Foo () {
Bar bar
static contraints = {
bar (nullable: false)
}
}
和管理条形类型的服务,方法删除:
line 105: BarService {
line 106: public BarCommand deleteBar(long Id) {
line 107: Bar b = Bar.get(Id)
line 108: if (!b.delete(flush: true)) {
line 109: //handle error here
如果存在现有的Foo,“f”已经有一个与之关联的ID为1的条形码(例如),那么第108行应该会失败并出现一些错误,解释“b无法删除,它被分配给Foo id :1“然而,所有发生的事情是第108行在真实性上返回false并且无论删除是否成功都会进入错误处理。
我们如何知道删除域名时删除是成功还是失败? doco没有描述这个--Hibernate报告HibernateException应该触发,但在任何Unit测试场景中都没有触发异常...
(http://docs.grails.org/latest/ref/Domain%20Classes/delete.html)
我意识到domain.delete()不会返回任何内容,因为删除在刷新事件之前没有传递给DB,所以我认为显式调用flush:true会解决这个问题,但它似乎没有。
答案 0 :(得分:1)
我个人不喜欢从数据库中检索对象的效率低的唯一目的是删除它,所以不是这样:
Bar b = Bar.get(Id)
if (!b.delete(flush: true)) {
// handle error here
}
我会使用HQL来执行删除,因为这样可以避免首先检索它(load()方法是另一种解决方案)。
Integer rowsDeleted = Bar.executeUpdate('delete Bar where id = ?', [Id])
if (!rowsDeleted) {
// handle error here
}
此方法的另一个好处是executeUpdate
返回更新/删除的行数,因此您可以检查操作是否是
成功的。