首先,get和load都是查询单个对象,而list和iterate为批量查询
注意以下写法仅针对hibernate3的语法。
使用案例如下:
1 // 1. get和load 的用法 2 Person p = session.get(Person.Class,1); 3 Person p = session.load(Person.Class,1); 4 5 // 2.list和iterate的用法 6 List<Person> persons = session.CreateQuery(" from Person ").list(); 7 for(Person person:persons) { 8 System.out.println(person.getName()); 9 } 10 11 Iterator<Person> persons = sesson.CreateQuery(" from Person ").iterate(); 12 while(persons.hasNext()) { 13 Person p = persons.next(); 14 System.out.println(p.getName()); 15 }
load和get的区别:
load和get都是用于获取对象的数据,但是在使用中还是存在一些差别。
1. get在使用中,会查询一级缓存,但是如果没有命中,则提交sql语句到数据库重新查询。
2. load在使用中,会优先查询一级缓存,如果没有命中,则会查询二级缓存,如果仍然没有命中,才回提交sql到数据库中执行查询。
3. load支持延迟加载的功能,但是get不行。
4. 如果get未查询到结果,则会返回null值。 如果load未查询到结果,则会抛出异常信息ObjectNotFoundException。
在hibernate中,通常session层次的为一级缓存,sessionFactory层次的为二级缓存,其中二级缓存需要额外开启。
list和iterate的区别:
1. list是直接根据SQL提交到数据库查询,并获取所有的对象。
当再次查询时,然后是根据SQL提交到数据库中查询,并获取所有对象。
2. iterate分两步,第一步是根据SQL提交到数据库查询到所有对象的主键值,并保存到session缓存中去。
然后根据主键查询获取到所有的对象保存到sesson中。
当再次查询时,直接根据主键值查询缓存中的对象,如果存在的话,不再提交到数据库中重新查询了。