session.get | session.load |
1.没有符合条件的记录会返回null 2.不支持Lazy 3.查找顺序为: 一级缓存---->二级缓存---->数据库(返回的是实体对象) | 1.没有符合条件的记录会报ObjectNotFoundException 2.支持Lazy 3.查询数据的顺序:一级缓存---(没有找到)-->代理对象--用到数据时(如user.getUserName())-->二级缓存--->数据库(返回的是代理对象) |
为验证以上说法,写了一个测试:
public class TestHelloWorld {
private SessionFactory sessionFactory;
private ClassPathXmlApplicationContext context;
private Session session;
@Before
public void before(){
context= new ClassPathXmlApplicationContext("applicationContext.xml");
sessionFactory = (SessionFactory) context.getBean("sessionFactory");
session = sessionFactory.openSession();
}
@Test
public void testGetLoad(){
//User user1=(User) session.get(User.class, 1);实体对象
//User user2=(User) session.load(User.class, 1); 实体对象,因为它会先从一级缓存中找,如果没找到才会创建代理对象
User user = (User) session.load(User.class, 1);//返回代理对象
User user1=(User) session.get(User.class, 1);//代理对象
Message message = (Message) session.get(Message.class, 1);//返回实体对象
String p = user.getPassword();//在这一行设置断点可以看到两个对象的不同之处。
// User user = (User) session.load(User.class, 1);//返回代理对象
// String p = user.getPassword();//初始化代理对象
// User user1=(User) session.get(User.class, 1);//返回的也是代理对象
}
}
user对象是一个代理对象,里面有两个属性,initialized跟target,在运行String p = user.getPassword();这一句之前,initialized为false,target为null。target就是user这个代理对象所对应的的实体对象。
message对象是一个实体对象。
在运行那一句之后,user对象里面的两个属性值也改变,initialized变成了true,target是一个User类型的实体对象。
上面代码里有三种情况:
1.如果先有get过,在一级缓存中也就有这个对象,load也会得到一个实体对象。
2.先load后get,load得到的是代理对象,get得到的是实体对象。
3.先load,初始化之后再去get,get得到的也是代理对象。