http://blog.youkuaiyun.com/myxx520/article/details/5767659
Hibernate 为我们提供一套很好的数据持久化解决方案,同时Spring也为我们封装了很多模板方法,比如
实现HibernateDaoSupport后得到模板操作对象以及一些回调接口,如HibernateCallback,jdbcTemplete等,这些模板方法
大大的减少了我们的代码量,同时使得代码干净明了,今天谈谈我对HibernateCallBack的理解以及应用
首先,我们定义一个回调接口,回调接口的参数是一个上下问参数
package example;
import org.hibernate.Session;
/**
* 定义回调接口
*
* @author Jack Zhang
* @date 2010-07-25
*/
public interface CallBackInterface {
public void invoke(Session obj);
}
定义个一模块操作类,将Hibernate中常用的OpenSession ,CloseSession,以及一些事物处理抽取出来作为模板对象
package example;
import org.hibernate.Session;
import com.kiloway.equipment.utils.HibernateSessionFactory;
/**
* 定义模板方法
*
* @author Jack Zhang
*/
public class JdbcTemplete {
// 将实体对象持久化
public void persist(CallBackInterface action) {
Session session = null;
try {
session = HibernateSessionFactory.getSession();
session.beginTransaction();
// 通过接口进行回调
action.invoke(session);
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
e.printStackTrace();
} finally {
session.close();
}
}
}
其中 action.invoke(session);是回调的关键,在JdbcTemplete中,action是一个接口,在实际调用过程中,使用匿名的内部类实现该接口,进行调用,如:
package example;
import org.hibernate.Session;
/**
* @author Jack
* @date 2010-07-26
* 测试回调接口
*/
public class Test {
public static void main(String[] args) {
JdbcTemplete jdbcTemplete = new JdbcTemplete();
jdbcTemplete.persist(new CallBackInterface() {
public void invoke(Session obj) {
obj.save("OBJECT");
}
});
}
}
这样,我们就不用在每个持久化对象中定义,openSession ,closeSession等方法,可完全把这些代码放置到模板类中,不仅仅减少了代码量,同时代码也更加简洁