如何让grails'在记录中找不到异常?

时间:2014-03-04 11:43:03

标签: grails gorm

我希望get方法在找不到记录时抛出异常。我不想测试结果是否为空。

1 个答案:

答案 0 :(得分:6)

异常是昂贵的,在Groovy中更是如此,因为所有额外的堆栈帧。当您触发或抛出预期的异常时,您需要支付填充堆栈帧的成本,虽然这对于一个实例来说并不是非常昂贵,但它会在生产中加起来。查看这篇文章,但是如果使用Groovy进行额外的运行,会发现性能会更差:http://shipilev.net/blog/2014/exceptional-performance/

话虽如此,我可以想到的一种快速触发缺失行异常的方法是使用load方法而不是getload永远不会返回null,它总是返回一个存储了id的代理。一旦引用除id之外的任何属性,Hibernate就会转到数据库并在该id没有行的情况下抛出异常。

更直接的选择是为您的域类添加一个使用get的静态方法,但会对您进行空检查,例如。

class MyDomainClass {

   ...

   static MyDomainClass retrieve(id) {
      MyDomainClass instance = MyDomainClass.get(id)
      if (instance == null) {
         throw new NotGotException(id)
      }
      instance
   }

   static class NotGotException extends RuntimeException {
      NotGotException(id) {
         super("No MyDomainClass found for id $id")
      }

      Throwable fillInStackTrace() {
         return this
      }
   }
}

在此,我覆盖fillInStackTrace无所作为,以避免不必要地收集不需要的和昂贵的信息的费用。