自己扩展封装Hibernate模板DAO-之一简介

SpringSide是以Spring Framework为核心,提供Pragmatic之中又适合工业化大规模开发的企业应用Kickstart。

 这是前一段时间接触的一个Java Web项目环境搭建工具

网址:http://www.springside.org.cn/

 

SpringSide中自己写了一部分代码,感觉使用起来挺不错的,

使用起来有一点麻烦,于是自己动手进行改制,封装成自己用的Java包,可以用于

1.Hibernate 单独使用

2.Hibernate+spring 简单(Ioc)混合使用

3.Hibernate+spring 基于事务(Ioc+AOP)混合使用

一.思路

1.将其中的java类封装尽可能脱离太多的jar包依赖

2.可以支持hibernate单独使用也可用Spring的Ioc 和AOP进行使用

二.动手

涉及到的java类有:

org.springside.modules.orm.hibernate.SimpleHibernateDao;

org.springside.modules.orm.hibernate.HibernateDao;

org.springside.modules.orm.Page

org.springside.modules.orm.PropertyFilter

org.springside.modules.utils.reflection.ConvertUtils

org.springside.modules.utils.reflection.ReflectionUtils

使用的Jar包有:

commons-beanutils-1.8.3.jar

commons-lang-2.5.jar

 

 

最终我封装剩下:

com.haha.hibernate.SimpleHibernateDao;

com.haha.hibernate.HibernateDao;

com.haha.hibernate.Page

com.haha.hibernate.PropertyFilter

 

主要进行处理的代码:

在SimpleHibernateDao.java中有一个

getSession的方法,

原码是:

 

public Session getSession() {
  return sessionFactory.getCurrentSession();
 }


这种使用方式必须使用spring的aop将Session绑定到线程上才可以获取数据,而我的封装思想是可以单独使用也可以使用spring的aop;

*手动获取Session需要关闭Session

*aop就不用关闭Session

修改为:

protected Session session=null; 保存Session
 protected boolean isManual=false; 标识是不是手动处理

public Session getSession() {
  
  if(session==null && sessionFactory==null){  //如果是直接使用
   Configuration config=new Configuration().configure("/hibernate.cfg.xml");//读取src目录中的hibernate.cfg.xml文件
   sessionFactory=config.buildSessionFactory();
   session=sessionFactory.openSession();
   isManual=true;//手动使用
  }
  else{
   
   try {
    session = sessionFactory.getCurrentSession();//基本spring aop获取session
   } catch (Exception e) {
    e.printStackTrace();
    isManual=true;//失败就自己手动获取
    session=sessionFactory.openSession();
   }
  }
  
  return session;
 }


//手动获取Session需要关闭Session

//aop就不用关闭Session

public void closeSession(){
  if(isManual){
   session.close();
   sessionFactory.close();
  }
   
 }

在hibernate 中需要进行关闭Session处理和判断是不是手动处理

 public void save(final T entity) {
  Session s=getSession();
  if(isManual){   //如果手动,就需要自己开启事务
   Transaction tran=session.beginTransaction();
   try {
    s.saveOrUpdate(entity);
    tran.commit();
    
   } catch (Exception e) {
    tran.rollback();
    e.printStackTrace();
   }
   closeSession();
   
  }
  else{
   s.saveOrUpdate(entity);
  }
  logger.debug("save entity: {}", entity);
 }

 

 public T get(final PK id) {
  T t= (T) getSession().load(entityClass, id);
  closeSession();//关闭Session
  return t;
 }


还有一些反射我将方法封装进来,就不需要其它的java类和jar包了!

最后使用jar命令打包haha.hibernate.jar

jar包已上传资源!需要的请移步:http://download.csdn.net/user/Lijun7788

你可能感兴趣的:(spring,AOP,Hibernate,exception,session,扩展)