get和load的实现


                           load event(产生)                                    onLoad Event

      Hibernate ——————–>LoadEventListener—————>event——>return event—–>getResult()

    其中:①:——>setResult(event.session(查找))


未使用二级缓存     


load 先从缓存(一级)中查找,如果没有查询结果,就到数据库中查找,不管查询结果如何,都返回XX_$$_javassist_0对象(代理类实例)。



当在数据库中查询结果为空时, 生成代理类实例 的ID为load的ID(既session.load(XX.class,id),这个id),其他属性为空。获取load的对象的属性,会抛出异常org.hibernate.ObjectNotFoundException: No row with the given identifier exists…获取ID则会返回查询的ID。


load是延迟加载,返回持久化对象或者代理实例,首先返回的是代理实例,在真正使用到对象(比如Person.getName())的时候才会到数据库里去查询,这样提高效率。


get 先从缓存(二级)中查找,如果没有查询结果,就到数据库中查找,返回XX对象,如果为空就返回null。 get是直接去查询对象,返回持久化对象或者null。


使用二级缓存


首先知道一级,二级缓存的生命周期。一级缓存存活于同一个session中,而二级缓存存活于整个应用中。   

二级缓存需要手动配置的。


load和get都是先从一级缓存中查找,如果没有查询结果,就到二级缓存中查找。

测试时先将第一个session.close(),然后再开一个session(sessionFactory.operSession())。

 
测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Test {

session = sessionFactory.openSession();

Person person = new Person();
session.beginTransaction();
person = (Person) session.load(Person.class, id);
System.out.println(person.getName());

session.getTransaction().commit();
session.close();
session = sessionFactory.openSession();
person = null;
person = (Person) session.load(Person.class, id);
System.out.println(person.getName());
}