hibernate中的懒加载和急加载的区别

懒加载: FatchType.LAZY   :在加载一个实体的时候,不会马上从数据库中加载,即从数据库中加载到内存。

急加载:FatceType.EAGER :在加载一个实体时,会立即从数据库中查询,与其关联的类也会被同时查询。

在我们使用@ManyToOne等时,都会被默认为急加载。

在hibernate中,我们无论是使用懒加载还是急加载,get方法都会一次加载所有基本数据类型属性的值,而load则不同。

在我们开启了懒加载之后,load方法只会加载id属性,所有的非id属性的访问操作都不会执行。只有id属性中有实际值(其实就是你调用load方法时传的那个),

在session没有关闭的之前,如果访问除id外的其他属性才会发sql语句去查询,我们经常犯的一个错误就是在当前session关闭以后访问由load()加载的对象的非id属性,

此时Hibernate尝试通过当前session发sql查询,但发现session已经关闭,这样就会发出no session的异常 。

一般我们将将FetchType.lazy 改成 EAGER ,就可以避免这个错误。

但是在我们需要查询一个表时,如果这个表有很多与其关联的表,如果使用急加载的话,在第一次加载就会很慢,如果是懒加载相对则会快一些。但是在我们又需要查询与此表相关的数据的时候

急加载就会很快,因为在第一次加载的时候,已经帮我们全部加载好了。而懒加载则会相对慢一些,因为在我门需要查询的时候,它才会帮我们去查。

所以让他们算是各有优缺点。

而我们用哪一种方法更好,则需要根据我们的具体情况去使用了

posted @ 2017-07-27 17:57  唐俊威  阅读(2115)  评论(0编辑  收藏  举报