例外是昂贵的,在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不做任何事情以避免不必要地收集不需要的和昂贵的信息的成本.