首先介绍get()和load()方法的区别:web
get()方法和load()方法的区别主要在于对二级缓存的使用上。数据库
load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。缓存
get():若是在数据库中没有记录会返回空,get()不管如何都会返回数据.spa
load():若是数据库中没有记录会抛出异常,若是有数据返回的是一个代理对象。hibernate
get()方法默认不支持lazy(延迟加载)功能,而load支持延迟加载代理
get()方法在查询不到数据时,返回null,而load由于支持延迟加载,只有在使用对象时才加载,因此若是数据库中不存在在数据load会抛出异常(org.hibernate.ObjectNotFoundException)。orm
get()和load()只根据主键查询,不能根据其它字段查询,若是想根据非主键查询,可使用HQL对象
list和iterator()方法之间的区别:(N+1?)内存
list()方法在执行时,直接运行查询结果所须要的查询语句。get
iterator()方法则是先执行获得对象ID的查询,而后在根据每一个ID值去取得所要查询的对象。
所以:对于list()方式的查询一般只会执行一个SQL语句,而对于iterator()方法的查询则可能须要执行N+1条SQL语句(N为结果集中的记录数).
结果集的处理方法不一样:
list()方法会一次活的全部的结果集对象,并且他会依据查询的结果初始化全部的结果集对象。若是在结果集很是庞大的时候会占据很是多的内存,甚至会形成内存溢出的状况发生。
iterator()方法在执行时不会一次初始化全部的对象,而是根据对结果集的访问状况来初始化对象。一次在访问中能够控制缓存中对象的数量,以免占用过多的缓存,致使内存溢出状况的发生。