文章源出处[url]http://ajava.org/article-1531-1.html[/url],写得不错分享下。
[b]1.get()和load()方法的区别: [/b]
[b]a.[/b]get()方法和load()方法的区别主要在于对二级缓存的使用上。
[b]b.[/b]load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。
[b]c.[/b]get()方法默认不支持lazy(延迟加载)功能,而load支持延迟加载
[b]d.[/b]get()方法在查询不到数据时,返回null,而load因为支持延迟加载,只有在使用对象时才加载,所以如果数据库中不在数据load会抛出异常(org.hibernate.ObjectNotFoundException)。e.get()和load()只根据主键查询,不能根据其它字段查询,如果想根据非主键查询,可以使用HQL
[b]2.list和iterator()方法之间的区别:(N+1?) [/b]
[b]a.[/b]list()方法在执行时,直接运行查询结果所需要的查询语句。
[b]b.[/b]iterator()方法则是先执行得到对象ID的查询,然后在根据每个ID值去取得所要查询的对象。
因此:
对于list()方式的查询通常只会执行一个SQL语句,而对于iterator()方法的查询则可能需要执行N+1条SQL语句(N为结果集中的记录数).
list()方法会一次活的所有的结果集对象,而且他会依据查询的结果初始化所有的结果集对象。如果在结果集非常庞大的时候会占据非常多的内存,甚至会造成内存溢出的情况发生。
iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。一次在访问中可以控制缓存中对象的数量,以避免占用过多的缓存,导致内存溢出情况的发生。
缓存部分请参照:
[url]http://www.iteye.com/topic/249465[/url]
[b]1.get()和load()方法的区别: [/b]
[b]a.[/b]get()方法和load()方法的区别主要在于对二级缓存的使用上。
[b]b.[/b]load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。
[b]c.[/b]get()方法默认不支持lazy(延迟加载)功能,而load支持延迟加载
[b]d.[/b]get()方法在查询不到数据时,返回null,而load因为支持延迟加载,只有在使用对象时才加载,所以如果数据库中不在数据load会抛出异常(org.hibernate.ObjectNotFoundException)。e.get()和load()只根据主键查询,不能根据其它字段查询,如果想根据非主键查询,可以使用HQL
[b]2.list和iterator()方法之间的区别:(N+1?) [/b]
[b]a.[/b]list()方法在执行时,直接运行查询结果所需要的查询语句。
[b]b.[/b]iterator()方法则是先执行得到对象ID的查询,然后在根据每个ID值去取得所要查询的对象。
因此:
对于list()方式的查询通常只会执行一个SQL语句,而对于iterator()方法的查询则可能需要执行N+1条SQL语句(N为结果集中的记录数).
list()方法会一次活的所有的结果集对象,而且他会依据查询的结果初始化所有的结果集对象。如果在结果集非常庞大的时候会占据非常多的内存,甚至会造成内存溢出的情况发生。
iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。一次在访问中可以控制缓存中对象的数量,以避免占用过多的缓存,导致内存溢出情况的发生。
缓存部分请参照:
[url]http://www.iteye.com/topic/249465[/url]