1.Hibernate框架的特性
1)一级缓存
session对象级别的缓存,利用该session取出的对象会放到缓存中.在后续查询时,首先去缓存中寻找,没有再去数据库寻找.
session缓存区在session关闭后销毁.session复杂维护缓存区中对象的状态.
在使用时,为了更好发挥一级缓存,需要保障同一个线程处理中,使用同一个Session对象.
a.使用ThreadLocal对SessionUtil进行改造,将Session对象与ThreadLocal绑定.
public class HibernateUtil {
private static ThreadLocal
private static Configuration conf;
private static SessionFactory factory;
static {conf=new Configuration();factory=conf.buildSessionFactory();}
public static Session getSession(){ Session session=tl.get();
if(session==null){ session=factory.openSession(); tl.set(session);}return session; }
public static Session closeSession(){ Session session=tl.get(); if(session!=null){session.close();tl.set(null);
}return session;}}
b.Hibernate3之后的新版本,可以使用以下方法
首先在hibernate.cfg.xml中添加配置
thread
之后使用sessionFactory.getCurrentSession()方法获取Session
注意:在使用此session时,必须将session操作封装在一个transaction
一级缓存的管理:
session.evict(obj);将obj对象从当前session的一级缓存中清除.
session.clear():清除当前session的一级缓存.
2)延迟加载
当获取一个实体对象后,实体对象并没有立刻发送SQL语句,去数据库加载数据.而是在调用对象的getXXX()方法时采取加载数据.
支持延迟加载的方法:session.load(),query.iterator().延迟加载方法返回的对象类型,是动态代理类型.
session.get()和session.load()方法功能是按主键做条件查询数据,区别
如下:
a.get()方法不支持延迟加载,load()方法支持
b.如果数据表中没有符合的记录,get()方法返回null,load()抛异常
c.如果数据表中有符合的记录,get()返回的是实体类型对象,load()返回的是动态代理类型对象.
在使用时,需要注意以下事项:
a.使用延迟加载的API后,避免过早的关闭Session.
LazyInitializationException: could not initialize proxy - no Session
b.根据需要选择延迟加载和非延迟加载API
-----------------了解----------------------
Hibernate延迟加载机制:利用动态生成代理类型机制生成一个动态代理类,并重写对象的getXXX()方法,当调用get方法时,触发SQL查询,去数据库加载数据.
Hibernate动态生成代理类型机制:
以前编写程序:
a.编写一个类源码
b.调用编译器将源码编译成class字节码
c.类加载器将字节码文件载入虚拟机内容
d.虚拟机调用字节码文件的方法,解释运行
Session.load()等延迟方法返回的类型是Foo$Enhancer$CGLIB....,
这些类型是Hibernate框架利用程序在内容中动态生成并编译的类型.
上述功能,是Hibernate调用asm.jar,cglib-2.1.3.jar工具包完成的.
asm.jar主要用于在内存中动态和编译生成一个类
cglib.jar是基于asm.jar,对其扩展,在内存中生成一个代理类型.该代理类是原类型的一个子类.
3)Hibernate中对象的状态
在Hibernate使用中,对象的状态有以下三种
a.临时对象 : 在程序中使用new方式创建的对象
b.持久对象 : 在程序中与session对象关联,由session负责管理的对象.
处于session缓存中的对象都是持久对象
对象的持久性:指的是对象的数据状态在事务提交时可以与数据库保持同步更新.
session.flush();//将持久对象与数据库同步
tx.commit();//事务提交,提交前默认也调用session.flush()
c.托管对象 : 在程序中如果session.close()后,session负责管理的持久对象将成为托管对象.垃圾回收器负责回收临时和托管状态,持久状态不能回收.
2018年全国计算机等级考试调整方案
[考试动态]2017年11月20日全国计算机等级考试计算机基础及Photoshop应用试题答案汇总(6套)
[Photoshop应用]2017年2月3日全国计算机等级考试四级数据库系统工程师试题及答案汇总(22套)
[数据库工程师]2017年2月2日全国计算机一级考试模拟试题及答案300题
[WPS Office应用]2017年1月22日2017年3月全国计算机等级考试报名时间及报名入口汇总
[考试动态]2017年1月3日