Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29952690
  • 博文数量: 708
  • 博客积分: 12163
  • 博客等级: 上将
  • 技术积分: 8240
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-04 20:59
文章分类

全部博文(708)

分类: Java

2008-12-25 11:13:27

要求能 BL的方法 访问 多少个 DAO,一旦失 都能

解决方案:在 S2DAO 例子程序基础上实现事务管理( JDBC 中的事务管理,出错时进行回滚)

核心问题:只使用一个 container (该容器内不仅可以装 DAO ,比如我们前面熟知的 EmployeeDao DepartmentDao ;还可以装业务逻辑,比如 HogeImpl 类的 foo 方法)

核心配置文件 HogeClient.dicon

"">

   

      

      

       examples.dao.EmployeeDao ">

              dao.interceptor

      

       examples.dao.DepartmentDao ">

              dao.interceptor

      

      

    examples.tx.HogeImpl ">

        j2ee.requiredTx

   

   

测试类 HogeClient.java

package examples.tx;

import org.seasar.framework.container.S2Container;

import org.seasar.framework.container.factory.S2ContainerFactory;

import examples.dao.DepartmentDao;

import examples.dao.EmployeeDao;

public class HogeClient {

       private static final String PATH = "examples/tx/HogeClient.dicon" ;

       public static void main(String[] args) {

              S2Container container = S2ContainerFactory.create ( PATH );

              container.init();

              HogeImpl hoge = (HogeImpl) container.getComponent(Hoge. class );

              hoge.foo();

       }

}

接口 Hoge.java

package examples.tx;

public interface Hoge {

    public void foo();

   

}

实现类 HogeImpl.java

package examples.tx;

import examples.dao.Department;

import examples.dao.DepartmentDao;

import examples.dao.Employee;

import examples.dao.EmployeeDao;

public class HogeImpl implements Hoge {

      

       private EmployeeDao empDao ;

       private DepartmentDao deptDao ;

       public void setEmpDao(EmployeeDao empDao) {

              this . empDao = empDao;

       }

       public void setDeptDao(DepartmentDao deptDao) {

              this . deptDao = deptDao;

       }

       public void foo () {

              try {

                     //insert emp

                     Employee emp = new Employee();

                     emp.setEmpno( 1 );

                     emp.setDeptno(10);

                     empDao.insert(emp);

                     System. out .println(emp);

                     //insert dept

                     Department dept = new Department();

                     dept.setDeptno( 1 );

                     dept.setDname( "foo" );

                     deptDao.insert(dept);

                     System. out .println(dept);

              } finally {

                     // container.destroy();

              }

       }

}

备注:J2ee.dicon文件的配置请参考前面一篇blog

(对于requiredTx的配置原先就有,不用动它;注释掉默认的HSQL,使用PostgreSQL数据库)。

 

说明:这个实现综合了官网上事务的自动控制部分

和下载的s2DAO示例程序。

首先自己在原先示例程序基础上再做个例子,合并两个dao的插入操作,然后将这段逻辑放入foo方法,在配置文件中对这个业务逻辑进行事务管理,从而实现了对两个dao的insert等操作进行事务处理。

 

BL Business Logic 的事 务处 测试结 果:
在下面的情况下 测试 2 dao insert方法,在一个 BL方法中先后 行,第一个 insert成功,第二个 insert 。判断 测试结 果的方法是 看数据 表里的数据。
测试 1:当不使用事 务时 ,第一个表插入成功,第二个表插入失
测试 2:当使用事 务时 ,第一个表插入失 ,第二个表插入失

结论 Dao BL层对 象从一个 S2Container DIContainer)中 取, BL 象添加事 要求

 

说明:实现思路和测试说明来源于部门首席技术专家!

 

 

补充:

container.init(); 执行这句时,进行才初始化工作。

会调用 setEmpDao setDeptDao 方法,将从容器中拿出的 empDao deptDao 对象赋值给 HogeImpl 中的两个成员变量 empDao deptDao

阅读(2437) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~