Hibernate中session.get()和session.load()的区别

session.getsession.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得到的也是代理对象。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值