GORM domain.delete(flush:true)没有激发HibernateException或其他反馈?

时间:2016-05-31 00:32:46

标签: hibernate grails gorm

假设:

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会解决这个问题,但它似乎没有。

1 个答案:

答案 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返回更新/删除的行数,因此您可以检查操作是否是 成功的。