hibernate 中的get跟load方法

hibernate 中的get和load方法

相同点:

       他们都可以通过指定的实体类与ID从数据库中读取数据,并返回对应的实例。

不同点:

        主要区别就是延迟加载的概念

        get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库,数据库中没有就返回null;

        load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库,数据库中没有就抛出ObjectNotFoundException,属于HibernateException的子类。

 

这里提醒一个被好多人误解的概念

       get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。