import net.sf.hibernate.*;
public class HibernateTemplate {
public static Object run(HibernateCallback callBack)
throws HibernateException {
Session session = null;
Transaction tx = null;
try {
session = HibernateSessionutils.currentSession();
tx = session.beginTransaction();
Object result = callBack.execute(session);
tx.commit();
session.flush();
return result;
} catch (HibernateException e) {
tx.rollback();
return null;
} finally {
HibernateSessionutils.closeSession();
}
}
}
interface HibernateCallBack {
Object execute(Session session) throws HibernateException;
}
class JTest {
public void test() {
HibernateTemplate.run(new HibernateCallback() {
public Object execute() throws HibernateException {
session.save(obj);
return null;
}
}); // an anonymity class .
}
}
从上面的代码可以看出,要自己实现HibernateCallback接口,而每次实现的时候又重复代码了。因此再抽象,讲这些实现放到HibernateSupport类里面去。看看上面的代码就知道实现HibernateCallback接口的目的就是为了调用session.save()方法,即session的方法。代码如下:
import java.io.Serializable;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
public class HibernateSupport{
public Object save(final Object object) throws HibernateException{
return HibernateTemplate.run(new HibernateCallBack(){
public Object execute(Session session) throws HibernateException {
session.save(object);
return null;
}
});
}
public Object save(final Object object,final Serializable id) throws HibernateException{
return HibernateTemplate.run(new HibernateCallBack(){
public Object execute() throws HibernateException {
session.save(object,id);
return null;
}
});
}
public Object saveOrUpdate(final Object object) throws HibernateException{
return HibernateTemplate.run(new HibernateCallBack(){
public Object execute(Session session) throws HibernateException {
session.saveOrUpdate(object);
return null;
}
});
}
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
调用一些其他的session的方法。
}
抽象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();
}
}
使用例子:
定义一个自己的DAO类,实现代码如下:
public class UserDaoImpl extends RootDao implements UserDaoInterface{
public void saveUser(User user) throws KickException {
getHibernateTemplate().saveOrUpdate(user);
}
……………………………………………………………………………………
实现其他的方法
……………………………………………………………………………………
}