修改HibernateSessionFactory文件(这个文件是由Hibernate帮我们自己动完成的):
加上如下内容:
private static final ThreadLocal trthreadLocal = new ThreadLocal();//事务线程
/**
* 打开事务
*/
public static void OpenTransaction(){
Transaction tran=(Transaction) trthreadLocal.get();
if(tran==null){
tran=getSession().beginTransaction();
trthreadLocal.set(tran);
}
}
/**
* 提交事务
*/
public static void CommitTransaction(){
Transaction tran=(Transaction) trthreadLocal.get();
if(tran!=null && !tran.wasCommitted() && !tran.wasRolledBack()){
tran.commit();
trthreadLocal.set(null);
}
}
/**
* 回滚事务
*/
public static void RollbackTransaction(){
Transaction tran=(Transaction) trthreadLocal.get();
if(tran!=null && !tran.wasCommitted() && !tran.wasRolledBack()){
tran.rollback();
trthreadLocal.set(null);
}
}
新建一个开启与关闭Session与Transaction的Filter
public class SessionTransactionFilter extends HttpServlet implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
try {
HibernateSessionFactory.getSession();//打开session
HibernateSessionFactory.OpenTransaction();//打开事务
arg2.doFilter(arg0, arg1);
HibernateSessionFactory.CommitTransaction();//事务提交
} catch (Exception e) {
HibernateSessionFactory.RollbackTransaction();//回滚事务
e.printStackTrace();
}finally{
HibernateSessionFactory.closeSession();//关闭session
}
}
}
在我们的DAO中就可以不用管我们的Session与Transaction了
1, 共公接口
public interface CommonDAO {
public void save(Object obj);
public void delete(Object obj);
public void update(Object obj);
}
2, 共公方法
public class CommonDAOImple implements CommonDAO{
public Session GetSession(){
return HibernateSessionFactory.getSession();
}
public void delete(Object obj) {
this.GetSession().delete(obj);
}
public void save(Object obj) {
this.GetSession().save(obj);
}
public void update(Object obj) {
this.GetSession().update(obj);
}
}
3, 具体的某一个城对象的interface如下:
public interface FlDAO extends CommonDAO {
public TFl getone(int id);
public List getall();
public void delete(int id);
}
4, 具体的某一个城对象的DAO如下:
public class FlDAOImple extends CommonDAOImple implements FlDAO {
public List getall() {
Query query=this.GetSession().createQuery("from TFl");
return query.list();
}
public TFl getone(int id) {
return (TFl) this.GetSession().get(TFl.class, new Integer(id));
}
public void delete(int id) {
Query query=this.GetSession().createQuery("delete TFl where FId=:id");
query.setInteger("id", id);
query.executeUpdate();
}
}
5, 个人说明:
这样的做法可以解决Hibernate中的懒加载问题和每个方法中的Session开启与关闭,Transaction的开启与关闭。但是它带来的问题也是很大的
1, Session的开启在客户端请求时打开,请求完全结束时关闭,这样Session的开启时间太长,而Session中是非线程安全的。并且一个Session保持与数据库一个连接,长时间的占用了数据库的资源。
2, Transaction的开启时间在Session之后一点,关闭时间在Session之前一点,同样也开了很长的时间,这段时间内可能导致数据库里的数据库产生锁,别的线程没法操作数据。