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

use*_*577 5 session load hibernate exception

try {
   x = session.load(...); 
   y = x; 
 }
 catch(Exception e) {
    //do something
 }
Run Code Online (Sandbox Code Playgroud)

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

  1. 马上
  2. 将返回一个代理,然后在稍后尝试从db获取对象时抛出异常?

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

Tas*_*ass 6

简而言之:

  • x 加载后不会为空,所以也不会 y
  • load()如果对象不存在,则可能存在也可能不存在异常
  • 如果没有异常load(),并且该对象不存在,则访问时会出现异常xy.

详细说明:

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

请参阅文档,具体如下:

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

从使用load()的"hibernate in action"一书中:

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

所以:

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