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

<!-- --><!-- --> <!-- -->

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

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

 

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

 

核心配置文件 HogeClient.dicon

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"

"http://www.seasar.org/dtd/components24.dtd">

 

<components>

 

    <include path="dao.dicon"/>

       <include path="j2ee.dicon"/>

      

       <component class="examples.dao.EmployeeDao ">

              <aspect>dao.interceptor</aspect>

       </component>

       <component class="examples.dao.DepartmentDao ">

              <aspect>dao.interceptor</aspect>

       </component>

      

    <component class="examples.tx.HogeImpl ">

        <aspect>j2ee.requiredTx </aspect>

    </component>

   

</components>
 

 

测试类 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();

              }

       }

 

} 

-》在实现类的foo方法中,有两段跟数据库打交道的操作,算是一个事务。(20090519追加)


 

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

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

 

-》HSQL是一种内存数据库,PostgreSQL是实实在在的数据库。(20090519追加)

 

 

说明:这个实现综合了官网上事务的自动控制部分<!-- --><!-- --> <!-- -->http://s2container.seasar.org/2.3/ja/tx.html

和下载的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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值