5
try {
   x = session.load(...); 
   y = x; 
 }
 catch(Exception e) {
    //do something
 }

如果键不存在,将 load(...) 抛出异常

  1. 马上
  2. 稍后尝试从数据库中获取对象时会返回一个代理然后抛出异常?

另外,在上面的代码中,如果执行到了赋值y = x,是否保证此时x不为null?是否存在此时 x 可以为空的情况?

4

2 回答 2

6

简而言之:

  • x加载后不会为空,所以也不会y
  • load()如果对象不存在,可能有也可能没有例外
  • 如果 from 没有异常load(),并且对象不存在,那么访问xor时就会出现异常y

详细说明:

您是否试图确定密钥是否存在?或者你假设它是,但只是想处理异常?

请参阅文档,特别是:

您不应使用此方法来确定实例是否存在(get()改为使用)。仅使用它来检索您假设存在的实例,其中不存在将是实际错误。

从关于使用 load() 的“hibernate in action”一书中:

应用程序可以检索对持久实例的有效引用(代理),而无需访问数据库来检索其持久状态。所以 load()在缓存或数据库中找不到持久对象时可能不会抛出异常;当访问代理时,稍后将引发异常。

所以

如果您想知道该项目是否存在,请使用get(),而不是load()

于 2012-07-25T22:55:26.933 回答
3

添加到@Tass 的回复中,我发现(感谢同事)

  1. 如果 @Proxy(lazy="false") 立即抛出异常
  2. 如果 @Proxy(lazy="true") 不会抛出异常
于 2012-07-25T23:56:29.660 回答