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

Ale*_*hel 1 grails grails-orm

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

Bur*_*ith 6

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

话虽如此,我能想到的一种快速方法是触发缺失行的异常,load而不是使用该方法get.load永远不会返回null,它总是返回一个存储在其中的id的代理.只要引用除id之外的任何属性,Hibernate就会转到数据库并在该id没有行时抛出异常.

一个更直接的选择是向你的域类添加一个静态方法,get但是会对你进行null检查,例如

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
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我覆盖fillInStackTrace不做任何事情以避免不必要地收集不需要的和昂贵的信息的成本.