Hibernate入门(二)——操作实体对象

一、对象

|对象状态| old |session |record |发sql语句
| Transient |× |× |× |×
| Persistent |√ |√ |√ |√
| Detached |√ |× |√ |×
| Delete |√ |× |× |×
注:Transient(瞬时对象) Persistent(持久对象) Detached(托管对象) Delete(使持久化对象或托管对象转换为瞬时对象)

二、开启单线程

在hibernate.hbm.xml中添加:<property name="current_session_context_class">thread</property>

三、测试一个查询方法
//查询一个对象
	public void testGetUser() {
		Configuration cfg = null;
		SessionFactory sf = null;
		Session session = null;
		Transaction ts = null;
		try {
			//使用单例模式创建Configuration对象和Session工厂
			sf = HibernateUtil.getSessionFactory();
			//保证每个读写线程有唯一的session实例
			session = sf.getCurrentSession();
			//创建事务
			ts = session.beginTransaction();
			
			User u = session.get(User.class, 1);
			//可以直接从session获得,不用再次访问数据库,所以只发送一次select查询即可
			User u1 = session.get(User.class, 2);
			//u:持久化对象
			System.out.println(u.getName() + " " + u.getAge());
			u.setName("老李");
			u.setAge(66);
			//提交事务
			ts.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			if(ts != null) {
				ts.rollback();
			}
		}finally {
		}	
	}
执行结果

在这里插入图片描述

四、将托管对象转化为持久化对象
//托管对象转化为持久化对象
	public void testUpdateUser() {
		Configuration cfg = null;
		SessionFactory sf = null;
		Session session = null;
		Transaction ts = null;
		try {
			//使用单例模式创建Configuration对象和Session工厂
			sf = HibernateUtil.getSessionFactory();
			//保证每个读写线程有唯一的session实例
			session = sf.getCurrentSession();
			//创建事务
			ts = session.beginTransaction();
			
			User u = session.get(User.class, 3);
			//u:持久化对象
			System.out.println(u.getName() + " " + u.getAge());
			u.setName("王小二");
			u.setName("小二王");//只执行一次update语句
			u.setAge(11);
			
			//提交事务
			ts.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			if(ts != null) {
				ts.rollback();
			}
		}finally {
		}	
	}	
执行结果

在这里插入图片描述

五、Hibernate中session加载实体对象的过程

1、Hibernate持久层框架中有一级缓存二级缓存
(1)一级缓存:由session提供,默认总是有效的,当程序保存修改持久化实体时,session不会立即把改变提交到数据库,而是缓存在当前的session中,除非调用了session的flush()或者通过close()方法关闭session,通过一级缓存可以减少与数据库的交互,从而可以提高数据访问性能。
(2)二级缓存:由sessionFactory提供,是全局性的,所有session可以共享这个二级缓存,默认是关闭的,需要显示开启并指定需要使用哪种二级缓存实现类,一旦开启二级缓存并设置了需要使用的二级缓存实现类,sessionFactory就会缓存访问过该实体类的对象,除非缓存超出指定的缓存空间
2、session加载实体类的步骤
(1)在调用数据库查询功能之前,先在一级缓存中通过实体类型和主键N进行查找,如果一级缓存命中且数据状态合法,直接返回。
(2)如果一级缓存没有命中,在session中会在当前NonExists记录(相N当于查询黑名单)中查找,如果NNonExists中存在同样的查询条件,则返回null,说明之前查询时就没有相对应的结果,应该将查询加入NonExists中,之后若出现相同的查询语句,直接返回null,不必继续查询。
(3)如果一级缓存查询失败则查询二级缓存,如果二级缓存中命中,这直接返回结果。
(4)如果之前的查询都未命中,则发出sql语句,如果未发现对呀记录则将此次查询添加到session的nonExists中记录,并返回null。
(5)根据映射配置和sql语句得到ResultSet,并创建对应的实体对象。
(6)将对象纳入session(一级缓存)的管理中。
(7)如果有对应的拦截器,则执行拦截器中的onLoad方法。
(8)如果开启并设置了二级缓存,则将数据对象纳入二级缓存中。
(9)返回数据对象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值