首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

JavaEE5学习札记05-EJB之会话Bean(sessionBean)总结-5

2012-12-22 
JavaEE5学习笔记05-EJB之会话Bean(sessionBean)总结-----5其实这和无状态的会话Bean调用是一样的,这里需要

JavaEE5学习笔记05-EJB之会话Bean(sessionBean)总结-----5

其实这和无状态的会话Bean调用是一样的,这里需要补充的就是:一般可以远程调用的会话Bean实现类内部是不会直接调用业务增删改等等操作的,而是调用本地local的一个EJB组件作为其远程EJB实现类的一个注入的、内部变量。真正执行核心业务逻辑的是这个内部EJB组件。还有一点就是SessionBean的生命周期是可以被监听的,像@PostConstruct、@PreDestroy都是对EJB生命周期的监听方法(和JPA实体的生命周期监听器的意思差不多,有关JPA实体的生命周期具体请参考博客:

http://suhuanzheng7784877.iteye.com/admin/blogs/892041)。

因为EJB事务管理建立在JTA基础上,换句话说就是EJB应用容器会处理事务的底层细节,而开发人员只需要关系事务的传播、边界就可以了。

1):CMT叫做容器式管理事务,采用这种策略管理Bean的事务的时候,基本上只需要简单的注解+回滚代码即可完成事务的容器管理。容器管理事务总是以组件的方法为一个管理单位,方法开始,事务开始;方法结束,事务提交。这点类似于Spring的声明式事务,下面看一个容器管理事务的例子,接口就不给出了:

?

?

/**

?* CMT容器管理事务

?*

?* @author liuyan

?*

?* 容器遇到异常就将事务回滚

?* CONTAINER必须指定@TransactionAttribute

?*/

@Stateless

@TransactionManagement(TransactionManagementType.CONTAINER)

@TransactionAttribute(TransactionAttributeType.REQUIRED)

public class CMTServerEAOImpl implements CMTServer {

?

??? private DataSource dataSource;

?

??? @Resource

??? private SessionContext sessionContext;

?

??? public CMTServerEAOImpl() throws NamingException {

?????? Context context = new InitialContext();

?????? dataSource = (DataSource) context.lookup("java:/jbossdemo");

??? }

?

??? @Override

??? public void insert() {

?????? Connection connection = null;

?????? Statement statement = null;

?????? try {

?????????? connection = dataSource.getConnection();

?????????? statement = connection.createStatement();

?????????? String insert1 = "insert into person values(15,'史艳文')";

?????????? String insert2 = "insert into person values(14,'史青青')";

?????????? statement.executeUpdate(insert1);

?????????? statement.executeUpdate(insert2);

?????????? statement.close();

?????????? connection.close();

?????? } catch (Exception e) {

?????????? System.out.println("事务回滚~~");

?????????? sessionContext.setRollbackOnly();

?????????? e.printStackTrace();

?????? }

??? }

}

客户调用代码和JTA章节的测试代码差不多,在此不赘述了,主键为15的史艳文在数据库中没有记录,而主键为14的记录确因为主键重复插不进去,sessionContext.setRollbackOnly();就是事务回滚的操作。笔者的数据库记录如下:
JavaEE5学习札记05-EJB之会话Bean(sessionBean)总结-5
?开启JBoss服务器,执行测试代码,服务端控制台如下

?

14:51:01,869 INFO? [STDOUT] 事务回滚~~

14:51:01,869 ERROR [STDERR] com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '14' for key 'PRIMARY'

14主键重复,主键为15的史艳文也没能插进去……

那假如我们把史青青的主键修改为16,看看事务能否自动提交呢?

?

String insert2 = "insert into person values(16,'史青青')";

执行测试代码后数据库效果如下
JavaEE5学习札记05-EJB之会话Bean(sessionBean)总结-5

看来事务提交也不需您来管理了。但是有一个必须注意的地方,就是sessionContext.setRollbackOnly();必须在异常处理的时候加上,否则事务不会回滚,15号史艳文依然会插入数据库,16号史青青没有插进去。

CMT管理的好处就是,方便,不需要开发者在代码上做太多,只需要注解就可以。缺点就是缺乏灵活性,因为它总是以方法的开始做为事务的开始,方法结束后也就commit了,对于特殊业务处理的时候,CMT方式的策略就显得不是很灵活。

热点排行