javabean+映射文件
持久化类的编写规范:
必须有一个无参构造器
字段必须私有且提供公共的访问方法
类中必须有一个属性(OID)和表中的主键对应
尽量属性字段使用包装类修饰
尽量不要使用final修饰类
主键分类:
自然主键:使用表中一个有意义的字段作为主键.
★代理主键:为这张表添加一个字段,没有任何业务意义,只是作为唯一标识存在.
hibernate的主键生成策略:
increment:使用的hibernate的自增策略,插入记录之前先查询表中的最大id,然后将id+1,作为该条记录 的id.仅适用于单线程
identity:使用的数据库底层的自增策略,类型为整数,例如:mysql
sequence:使用的数据库底层的序列策略,类型为整数,例如:oracle
★native:使用的是本地数据库的策略,类型为整数,可以认为不是identity就是sequence
★uuid:使用的是唯一的字符串
assigned:放弃hibernate维护主键,手动的设置oid
三种状态:
瞬时态:没有oid且没有被session管理
★持久态:有oid且被session管理
脱管态:有oid但没有被session管理
三种状态的转换
瞬时态
获取:
通过new
转换:
瞬时态-->持久态
调用save()或者saveOrUpdate()
瞬时态-->脱管态
可以认为给对象设置了一个oid setId()
持久态
获取:
调用 get或者load或者其他的查询
转换:
持久态-->瞬时态
调用session.delete()
持久态-->脱管态
调用session的 close()或者 clear() 或者 evict(obj)
脱管态
获取:
我们可以认为
创建一个对象,设置一个oid
转换:
脱管态-->持久态
调用session的update()或者saveOrUpdate()
脱管态-->瞬时态
可以认为将对象的oid设置为null
注意:★
持久态对象可以自动更新数据库.(依赖于hibernate的一级缓存)
缓存:
介于应用程序和硬件之间的一个桥梁.
作用:减少对硬件的访问.
hibernate是一个封装了jdbc的框架.所以效率没有jdbc高,为了提高效率,hibernate提供了一系列的优 化策略,例如:缓存.
hibernate的一级缓存依赖的java中集合.
一级缓存中主要分成两块区域,一块叫做缓存区,一块叫做快照区.
hibernate中获取对象的时候,优先从缓存中查找
若找到:直接返回
若找不到:去数据库中查询,查询到之后放入缓存中一份.
当执行保存或者更新操作的时候,也会放入缓存中一份.
★放入缓存中数据,其实放入缓存区一份,也放入快照区一份.
操作的时候,操作的缓存区中的数据.
当事务提交的时候,对比缓存区中数据和快照区中数据是否一致
若一致:啥都不做
若不一致:会发送update语句
扩展:
一级缓存,hibernate自带的,不能卸载.生命周期和session的生命周期一致,称之为session级别的缓存
二级缓存,不是hibernate自带的.需要配置才能使用(ehcache).一般使用redis替代.
生命周期和sessionFactory生命周期一样,所以也称之为sesssionFactory级别的缓存.
事务就是一件完整的事情.可以包含多个操作单元,这些操作单元要么全部成功,要么全部失败.
事务的特性:
Atomicity、Consistency、Isolation、Durability
原子性:事务不可分割
一致性:事务执行前后的业务状态要和其他的业务状态一致.
隔离性:将每个事务隔离起来.尽量不受其他事务干扰
持久性:事务一旦提交,终将要保存到数据库中.
不考虑隔离性会产生的问题:
脏读
不可重复读 两次查询的结果 针对于update
虚读 两次查询的结果 针对于insert
可以通过设置事务的隔离级别避免问题:
1 read uncommited 读未提交,什么都不能避免
2 read commited 读已提交,避免脏读(oracle默认)
4 repeatable read 可重复读,避免脏读和不可重复读(mysql默认)
8 serializable 串行化,可以避免所有问题
hibernate中的隔离级别:
只需要在核心配置文件中配置
4</>
事务控制:
事务加载service层.必须使用连接对象.如何保证service层和dao层在同一个事务中.
只需要保证他们使用的是同一个连接.如何保证呢:
方式1:向下传递连接
★方式2:使用★ThreadLocal(将连接和当前的线程绑定)
hibernate中事务控制:
hibernate只是对connection的事务进行了封装.
若想使用手动控制事务,hibernate封装了线程绑定session的方式
使用当前线程中的session
1.配置核心文件
thread
2.就可以在java中通过
factory.getCurrentSession()获取了
注意:
若使用getCurrentSession方法,session对象不需要手动关闭.
1.oid检索(get和load)
2.对象导航:当配置了级联时,对象内会保存有级联的对象信息
3.hql检索
面向对象.
hql语句中不能出现表名和字段名.hql语句和sql语句很相似.
获取Query对象
session.createQuery(hql语句);
例如:
session.createQuery("from 类名")
方法:
list()
分页:
setFirstResult(开始的索引)
setMaxResults(每页显示的条数)
条件:hql和sql写法类型
设置参数:setParameter(int 问号索引,object 值);
唯一:
uniqueResult();
4.qbc检索
query by criteria
更加面向对象.看不到sql的影子.全部是方法
获取Criteria对象
session.createCriteria(Class);
方法:
所有:
list()
唯一:
uniqueResult()
分页:
setFirstResult(开始的索引)
setMaxResults(每页显示的条数)
条件:
add(Restrictions.eq | lt | gt | in | like("属性名",值));
5.sql检索
获取SqlQuery:
session.createSqlQuery(sql语句)
将每条记录封装成指定的实体
addEntity(class)
待续……