什么时候Hibernate Session.load()抛出异常

时间:2012-07-25 22:15:33

标签: hibernate session exception load

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

如果密钥不存在,将加载(...)抛出异常

  1. 马上
  2. 将返回一个代理,然后抛出异常 什么时候尝试从db获取对象?
  3. 此外,在上面的代码中,如果执行到达赋值y = x,是否保证在那时x不为空?是否存在x在此时可以为空的情况?

2 个答案:

答案 0 :(得分:6)

简而言之:

    加载后
  • x不会为空,因此y
  • 也不会为空
  • 如果对象不存在,load()可能会有或可能没有异常
  • 如果load()没有例外,且该对象不存在,则访问xy时会出现例外。

详细说明:

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

请参阅documentation,具体来说:

  

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

从书中' hibernate in action'使用load():

  

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

<强>因此

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

答案 1 :(得分:3)

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

  1. 如果@Proxy(lazy =“false”)
  2. ,会立即抛出异常
  3. 如果@Proxy(lazy =“true”)
  4. ,则不会抛出异常