本期项目的云盘地址:链接:http://pan.baidu.com/s/1jI750Vk 密码:9vgi
ps:关于hibernate的所有学习过程中的所有共享文件都在这个链接里面,我会不断更新的。
在上一次的项目中我们会发现,我们是每一个方法里面都必须去创建一个SessionFactory,然后通过SessionFactory去获取一个Session,这其实是一件一直在重复做的事情,我们完全可以考虑把这部分的代码封装起来,之后需要调用的时候直接调用就可以,不需要再去写一堆创建SessionFactory的代码
代码部分主要在com.h4这个包里面的HibernateSessionFactory.java
第一部分是一个静态的代码块
//静态代码块,程序一启动就会执行的代码
static{
try {
//读取配置文件hibernate.cfg.xml
configuration.configure();
//生成一个注册机对象
ServiceRegistry serviceRegistry =
new ServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.buildServiceRegistry();
//使用注册机对象serviceRegistry创建sessionFactory
sessionFactory = configuration.
buildSessionFactory(serviceRegistry);
} catch (HibernateException e) {
e.printStackTrace();
}
}
静态代码块跟静态方法不同,不需要通过类名去显性调用,也不需要new一个对象调用,在类启动的时候自动调用该方法。
hibernate4.x之前,SessionFactory是直接使用一个configuration对象调用buildSessionFactory()方法返回一个SessionFactory对象
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
但是4.x版本之后,hibernate采用先生成一个serviceRegistry 注册对象,在通过configuration对象的buildSessionFactory方法传入serviceRegistry ,最后返回一个SessionFactory。
//获得Session对象
public static Session getSession(){
//获取ThreadLocal对象管理的Session对象
Session session = (Session)sessionThreadLocal.get();
try {
//判断Session对象是否已经打开或者是否存在
if(session == null || !session.isOpen()){
//如果session对象为空或未打开,再判断SessionFactory对象是否为空
if (sessionFactory == null) {
rebuildSessionFactory();
}
//如果SessionFactory不为空,则打开session
session = (sessionFactory != null) ?
sessionFactory.openSession() : null;
sessionThreadLocal.set(session);
}
} catch (HibernateException e) {
e.printStackTrace();
}
return session;
}
获取Session的方法
需要做两个判断,第一是判断session是否为空以及session是否已经被打开
public static void closeSession(){
Session session = (Session)sessionThreadLocal.get();
sessionThreadLocal.set(null);
try {
if(session != null && session.isOpen()){
session.close();
}
} catch (HibernateException e) {
e.printStackTrace();
}
}
关闭Session方法,注意也要判断Session是否为空以及是否打开着。如果Session为空或者未打开,则无需做任何操作。
就先写到这里,主要是封装创建SessionFactory跟获取session以及关闭session的方法。代码跟上一篇文章合并在文件hibernate_2.zip
网友评论