我希望get方法在找不到记录时抛出异常。我不想测试结果是否为空。
答案 0 :(得分:6)
异常是昂贵的,在Groovy中更是如此,因为所有额外的堆栈帧。当您触发或抛出预期的异常时,您需要支付填充堆栈帧的成本,虽然这对于一个实例来说并不是非常昂贵,但它会在生产中加起来。查看这篇文章,但是如果使用Groovy进行额外的运行,会发现性能会更差:http://shipilev.net/blog/2014/exceptional-performance/
话虽如此,我可以想到的一种快速触发缺失行异常的方法是使用load
方法而不是get
。 load
永远不会返回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
无所作为,以避免不必要地收集不需要的和昂贵的信息的费用。