Hibernate get,load

当我们使用session.load()方法来加载一个对象时,此时并不会发出sql语句,会首先查询session缓存,如果没有则创建一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中或二级缓存中去查询我们的对象。

get方法首先查询session缓存,如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象。

如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。

即只要调用get就会发sql语句

相关推荐