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.youkuaiyun.com/user/Lijun7788