gethibernatetemplate().save(user);
session session = hibernateutil.getsession();
transaction tx = session.begintransaction();
session.save(user);
tx.commit();
hibernateutil.colsesession();
这里还省去了异常处理,同时使用了hibernateutil类来简化从sessionfactory获取session,以及关闭session等处理。
但是我们在使用hibernate的时候不一定会使用spring,所以我们可以模仿spring的处理方式,做一个hibernate的模板,使用模板模式来简化我们的开发,其主要的目的就是为了简化开发,使代码达到最大话的重用。
1. 我们现来实现一个hibernate模板:
package kick.hibernate;
import net.sf.hibernate.hibernateexception;
import net.sf.hibernate.session;
import net.sf.hibernate.transaction;
public class hibernatetemplate{
public static object run(hibernatecallback callback) throws hibernateexception{
session session = null;
transaction tx = null;
try {
session = hibernatesessionutil.currentsession();
tx = session.begintransaction();
object result = callback.execute(session);
tx.commit();
session.flush();
return result;
} catch (hibernateexception e) {
tx.rollback();
return null;
} finally {
hibernatesessionutil.closesession();
}
}
这里类很简单,就是使用一个实现hibernatecallback接口的一个回掉类,在调用的时候根据具体的需求实现hibernatecallback类。
2. 回掉接口hibernatecallback:
package kick.hibernate;
import net.sf.hibernate.hibernateexception;
import net.sf.hibernate.session;
public interface hibernatecallback {
object execute(session session)throws hibernateexception;
}
好了,到此为止我们就可以使用这个模板了,可以用如下的方式使用:
hibernatetemplate.run(new hibernatecallback() {
public object execute(session session) throws hibernateexception {
session.save(user);
return null;
}
});
看看,是不是省去了很多代码?
不过这还没有达到想spring里面那样简单,不要着急,“面包会有的”,我们会达到的。
3. 实现我们自己的hibernatesupport类
从上面的代码可以看出,我们要自己实现hibernatecallback接口,而每次我们实现的时候又重复代码了。因此我们再抽象,讲这些实现放到我们的hibernatesupport类里面去。看看我们上面的代码就知道我们实现hibernatecallback接口的目的就是为了调用session.save()方法,即session的方法。代码如下:(点击查看附件)
4. 抽象rootdao:
该类为抽象类,在实现自己的dao类的时候继承该类。该类的有一个hibernatesupport的对象,在子类中使用gethibernatetemplate()方法就可以得到该对象,然后调用它对应的方法。实现代码如下:
package kick.hibernate.dao;
import net.sf.hibernate.session;
import kick.hibernate.hibernatetemplateimpl;
public abstract class rootdao {
private hibernatesupport temp = null;
/**
* @return returns the temp.
*/
public hibernatetemplateimpl gethibernatetemplate(session session) {
return new hibernatesupport();
}
}
5. 使用例子:
定义一个自己的dao类,实现代码如下:
public class userdaoimpl extends rootdao implements userdaointerface{
public void saveuser(user user) throws kickexception {
gethibernatetemplate().saveorupdate(user);
}
…………………………………………
实现其他的方法
…………………………………………
}
新闻热点
疑难解答