当我们使用session.load()方法来加载一个对象时,此时并不会发出sql语句,会首先查询session缓存,如果没有则创建一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中或二级缓存中去查询我们的对象。
get方法首先查询session缓存,如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象。
如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。
即只要调用get就会发sql语句
get方法首先查询session缓存,如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象。
如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。
即只要调用get就会发sql语句
本文详细解释了Hibernate中session.load()和session.get()方法的工作原理。通过这两种方法加载对象时,Hibernate如何利用缓存机制减少数据库访问,提高应用性能。特别关注了代理对象的创建和实体数据的延迟加载过程。
433

被折叠的 条评论
为什么被折叠?



