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