1.一级缓存(session缓存 )、二级缓存
意义:提高hibernate查询效率。
缺点:可能会因并发,产生数据不一致。
本质:基于session 的缓存,利用hiberate执行查询的时候,hibernate会首先从session缓存去找,如果存在,则直接返回,如果不存在,则利用orm执行查询 将得到的对象保存至session缓存。
可以使用session.evict(obj);将obj从session缓存移除。
注意:一级缓存,自动开启着的。
public class Text1{
public static void main(String[] args){
//创建SessionFactory
SessionFavtory sessionFactory = null;
//创建Session
Session session = null;
//事务
Transaction tx = null;
try{
sessionFactory = new Configuration.configure().buildSessionFactory();
session = sessionFactory.getCurrentSession();
//开启事务
tx = sesison.beginTransaction();
UserInfo u1 = new UserInfo("9989","sd","23");
system.out.priint("-----------");
session.evict(u1);
UserInfo u2 = new UserInfo("9989","sd","23");
//执行U对象 操作 保存
Session.save(u);
//提交
tx.commit();
}catch(Exception e){
e.printStackTrace();
//事务回滚
tx.rollback();
}
}
}
二级缓存 :也叫 sessionFactory缓存。
本质: 基于sessionFactory的缓存,利用hiberate执行查询的时候,hibernate会首先从session缓存去找,如果存在,则直接返回,如果不存在,则去二级缓存找,存在则返回,不存利用orm执行查询 将得到的对象保存至session缓存,可以存至二级缓存。
注意:二级缓存需要在sessionFactory配置文件中,进行两处配置。
(a.配置启用二级缓存)
(b.配置二级缓存实现类)
需要对缓存本身进行专门配置。
(xxx.xml--配置缓存)
适用场合:频繁查询,极少修改的对象。
2.延迟加载
hibernate下延迟加载:
load执行查询的时候,返回hiberate代理对象。
当操作其非主属性的时候(Hibernate.initialize(proxy)),才会利用orm执行查询。
load/get 区别?
load: 默认 延迟加载
查不到: 抛出异常
get: 即可加载
查不到: 返回null
public class Text1{
public static void main(String[] args){
//创建SessionFactory
SessionFavtory sessionFactory = null;
//创建Session
Session session = null;
//事务
Transaction tx = null;
try{
sessionFactory = new Configuration.configure().buildSessionFactory();
session = sessionFactory.getCurrentSession();
//开启事务
tx = sesison.beginTransaction();
UserInfo u1 = (UserInfo)session.load(UserInfo.class,"1001");
system.out.print("-----------");
system.out.print(u1.getUse_pwd;
Hibernate.initilize(u1);
//提交
tx.commit();
}catch(Exception e){
e.printStackTrace();
//事务回滚
tx.rollback();
}
}
}
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.it.bean">
<class name="UserInfo" table="userInfo" lazy="true"> <!--是(true)否(false)延迟加载-->
<id name="user_id" column="user_id">
<!-- 主键生成策略 -->
<generator class="assigned"></generator>
</id>
<property name="user_pwd" column="user_pwd"></property>
<property name="user_sex" column="user_sex"></property>
3.hibernate 、session域 、pojo(java Bean的对象)三种状态
研究的session 域 /数据库 (oid-pk) 与 pojo 关系
瞬时态(临时态):数据库无 session无
持久态: session域 有 save/saveOrupdate/get/load/....
对持久态pojo操作,在事务提交前将会被 hibernate 利用 orm 同步到数据库。
脱管态(游离态): 数据库存在,而session 无
注意:session中不能有两个不同的对象,拥有一样的oid。
delete-(脱管态)-->持久态--->瞬时态