话不多说,直接进入正题。
学习Hibernate首先要理解什么是Heibernate?Hibernate解决了什么问题?
接下来就由我来总结一下,Hibernate是ORM(对象数据库表的映射)之一,Hibernate 实现了通过对象操作数据库表,解决程序员实现业务逻辑依赖大量的SQL语句,从繁杂的代码中解脱出来。
Hibernate英文是冬眠的意思,所以Hibernate位于持久层,把数据库访问的细节封装起来,但是数据的传递还是需要实体类实现实例化。而且实体类的数据类型一般用引用类型,因为数据的引用类型赋予null值。
Hibernate的搭建步骤:
拷贝必要的jar包,加载到构建路径----在应用顶部创建hibernate.cfg.xml----创建实体类,并且在该类的包下创建实体类名.hbm.xml----测试类测试
测试类中主要的代码之间的联系:
Hibernate常用的类或借口:
Configuration类:Configuration用于初始化hibernate.cfg.xml 创建Configuration之后如果不调用configure 那么默认初始化的是hibernate.properties 文件, configure 方法可以传入参数,用于加载配置文件。
SessionFactory : 一般一个应用对应着一个SessionFactory对象,这是因为其特点,SessionFactory是线程安全的,可以供多个线程使用;重量级,创建实例十分的耗费资源;是二级缓存(里边缓存了预制sql 语句,提高效率) ,所以一般都在启动应用时进行初始化操作。
Session:被称为持久化管理器,实现增删改操作,session 为轻量级,不会消耗太多的资源;线程不安全,一般一个线程对应一个session对象;含有一级缓存(后边详细介绍)。
Transaction:事务控制,实现事务的开启,提交和回滚
HIbernate不会编译时出异常,会在运行时期报错。
Hibernate区别对象:OID
java区别对象是根据内存地址,但是Hibernate区别对象根据oid(数据库的主键id相同,同时对象的equles和hascode相同)
OID的生成策略一般是 native ,hilo(根据高低算法),identity(自动增长),sequence
高低算法:value*(max_lo+1)+从0开始 value表示数据库的值,max_lo最大低位值。
Session(一级缓存):
session会把获取的记录加载到session缓存当中,提高效率。当session 对表进行操作,session缓存含有快照机制,session获取数据库的记录,快照自动备份一份记录,当实体对象发生改变时(跟快照做比较),seesion.flush( )更新清理数据,不清空缓存 。还有其他的方法,例如session.clear( )清空session中的缓存,session.envit( obj ) 从缓存中移除某对象,session.refresh( ) 数据库中的记录覆盖更改的缓存对象
清理的时机:
清理模式 | 查询QUERY | Transaction.commit | Session.flush |
FlushMode.AUTO(默认) | 清理 | 清理 | 清理 |
FlushMode.ALWAYS | 不清理 | 清理 | 清理 |
FlushMode.NEVER | 不清理 | 不清理 | 清理 |
FlushMode.COMMIT | 不清理 | 清理 | 清理 |