遗留系统采用了struts和hibernate,层次划分是很常见的表现层、service层、DAO层。
目前遗留系统有个事务处理的问题。代码在事务处理上面不统一:有的放在DAO层,有的在service层,各位看官肯定要说,这都没有统一吗,简直一堆狗屎。不错,我也觉得臭的受不了,所以采用了个简单的办法,真的很简单,呵呵。
其实如果事务处理的合理,事务处理放在哪一层倒是都可以。对于划分出服务层的系统来说,事务放在DAO处理会造成service层成为一个鸡肋的层次。关键是遗留系统处理service层事务的代码有问题:假设一个service方法包含了2个DAO的操作,且看有的代码:
Service方法:
Public void serviceMethod(){
dao.method1();
dao.method2();
}
DAO方法:
Public void method1(){
Session session = HibernateUtil.currentSession();
session.beginTransaction();
....
session.getTransaction().commit();
}
Public void method2(){
Session session = HibernateUtil.currentSession();
session.beginTransaction();
....
session.getTransaction().commit();
}
显然写代码的人认为service层的2个方法是一个事务单元,可是如此处理的结果:method1和method2却是执行在两个事务中,很显然这样处理是错误的。
个人认为,以下方法适用于hibernate做持久化处理的系统。当然,在此基础上稍做修改,也适用于直接应用JDBC或者其他持久层框架的系统。
Service方法:
Public void serviceMethod(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
dao.method1();
dao.method2();
tx.commit();
}
DAO方法:
Public void method1(){
Session session = HibernateUtils.getCurrentSession();
session.save(po1);
}
Public void method2(){
Session session = HibernateUtils.getCurrentSession();
session.update(po2);
}