一個應用的結構通常是
一個請求就是一個事務,所以不能在dao中打開、關閉session,否則多個dao對應的就不是同一個事務。
模擬session管理,將session放在過濾器中處理:
class TxFilter implements Filter{
puboic void doFilter(request, response, chain){
session = sf.openSession();
Utils.threadLocal.set(session); // 綁定到當前線程上
try{
tx = session.beginTransaction();
chain.doFitler(); // 放行
tx.commit();
}catch(e){
tx.rollback();
throw e;
}finallay{
session.close();
Utils.threadLocal.remove(); // 移除
}
}
}
class UserDao{
public void saveUser(User user){
session = Utils.threadLocal.get();
session.save(user);
}
}
public class Utils {
public static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
}