Hibernate中加载对象有两种方法:get和load。所谓的加载也就是查询对象的意思。那么这两种方法到底有什么区别呢?
(1)、调用get方法之后Hibernate会立刻发出Select语句,而load方法是在使用对象的时候才发出Select语句。也就是说,调用get方法之后,Hibernate会立刻去数据库中查询指定的数据,而调用load方法之后,Hibernate并不会立刻去数据库中查询数据,而是在下边时候这个对象的时候才去数据库中查询相关的数据。也就是延迟加载的意思。
(2)、调用get方法之后,如果Hibernate在数据库中没有找到这个对象,会返回null。而调用load方法之后,如果Hibernate在数据库中没有找到这个对象,会抛出ObjectNotFoundEcception异常。
使用load方法,Hibernate认为该ID对应的记录在数据库中是存在,所以可以在使用该对象的时候才用代理来延迟加载该对象。万一数据库中没有改对象,就只能抛出异常。加载的时候,Hibernate会下查一下Session缓存中是否有该ID对应的对象,没有则创建代理。所以,如果你知道该ID对应的对象在数据库中存在,则可以使用load方法加载该对象。使用get方法,Hibernate会先确认一下该ID对应的记录是否存在,现在Session缓存中查找,没有就去二级缓存中查找,最后再去数据库中查找。数据库中还没有,就返回null。
get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。