Hibernate框架(持久化类、缓存、事务管理)

持久化类

java类与数据库的表建立了映射关系,该类被称为持久化类

1)、编写规则

①无参构造,使得Hibernate可通过反射建立对象

②私有属性,get/set方法

③持久化类提供一个唯一标识OID与数据库主键对应

④持久化类属性尽量使用包装类(基本数据类型,默认值为0,有些歧义)

⑤持久化类不要使用final修饰(延迟加载需要继承产生代理类,而final修饰的类不能继承,即延迟加载失效)

2)、主键

①分类
自然主键:表中一个字段,实体类中一个具体属性
代理主键:主键的本身不是表中必须的一个字段
实际开发中,尽量使用代理主键, (OCP原则,主键参与有可能需要修改源代码)

②主键生成策略
在实际开发中一般不允许用户手动设置主键,一般将主键交给数据库,手动编写程序进行设置。

3)、持久化类的三种状态

hibernate是持久层框架,通过持久化类完成ORM操作。为了更好的管理持久化类,将持久化类分成三种状态。
持久化类=java类 + 映射
①瞬时态(transient)
没有唯一的OID,没有被session管理

②持久态(persistent)
有唯一的OID,有被session管理

③脱管态(detached)
有唯一的OID,没有被session管理

状态变换:刚new(瞬时态)、设置OID,并使用Session操作(持久态)、关闭session(托管态)

4)、三种状态转换

在这里插入图片描述

5)、持久态对象的特性

持久态对象可自动更新数据库:通过数据库获取到持久态对象后,更新数据的同时会自动更新数据库
底层原理,一级缓存。


缓存

1)、概述

将数据存入到内存中,使用的时候直接从缓存中获取,不用通过存储源

2)、一级缓存

Session级别的缓存(由Session中的一系列java集合构成),自带不可卸载
①特殊区域:
快照区:persistenceContext.entityEnteryContext.head.entityEntry.loadedState
缓存区:persistenceContext.entitiesByKey.table
当获取到持久对象时,会在缓存区存储一份,在快照区存储一份(一个map关系)
修改数据时,会修改缓存区的数据
提交事务时,会比较缓存区和快照区,若不一致则会更新数据库

例:
①执行查询后,缓存区和快照区都存储了数据
缓存区:
在这里插入图片描述
快照区:
在这里插入图片描述
②执行更新操作后,缓存区和快照区不相同
缓存区改变:
在这里插入图片描述
快照区不变:
在这里插入图片描述
②清空缓存
session.clear():清空所有缓存
session.evict(对象):清除某个对象的具体缓存

3)、二级缓存

SessionFactory级别的缓存,需配置


事务管理

1)、设置事务隔离级别

从轻到重:1、2、4、8
在核心配置文件中:

<property name="hibernate.connection.isolation">value</property>
2)、线程绑定

①Service层封装业务逻辑操作,而Dao层是封装数据源的单一操作
则事务需要添加在事务层上
此时需要保证多个操做的连接对象是同一个:向下传递、使用线程绑定(ThreadLocal)
Ps:这时执行完一个操作后,不应提交事务和关闭session

②Hibernate框架内部已经绑定好了ThreadLocal
在核心文件配置:

<property name="hibernate.current_session_context_class">value</property>

value有三个值:thread(对象声明周期与本地线程绑定)、jta(与JTA事务绑定)、managed(委托程序管理)
调用:getCurrentSession();

建立一个Utils来管理连接

public class SessionUtil {
 	private static SessionFactory sFactory;
 	static {
  		Configuration con = new Configuration().configure();
  		sFactory = con.buildSessionFactory();
 		}
 	/**
  	* 获取Session对象
  	* @return
  	*/
 	public static Session getSession() {
  		return sFactory.openSession();
 	}
 
 	/**
  	* 关闭Session对象
  	* @param session
  	*/
 	public static void closeSession(Session session) {
  		session.close();
 	} 
 	
	 /**
  	* 利用线程绑定,完成跨类事务
  	* @return
  	*/
 	public static Session getCurrentSession() {
  		return sFactory.getCurrentSession();
 	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值