区别大了
SessionBean在用户会话结束后就自动销毁了,也就是说你虽然可以进行数据库操作,但是仅限于会话,而且BMP的许多生命期函数是容器自动调用的,通过这些函数你可以方便的实现BMP和数据库中的数据保持一至,如果你用SessioBean就必须自己写这些保持数据一致的程序,而且你要不时地考虑到它们.
简单说:BMP很容易将数据纪录映射到具体的类实例,从而被容器自动管理,而你用SessionBean仅限于数据操作而已.
要详细你还是看书吧.

解决方案 »

  1.   

    gz
    两种方法我都用过,BMP方便点,在SessionBean里麻烦点,不过其他的东西我还体会不到什么
      

  2.   

    能说详细点吗?
    你说的“BMP的许多生命期函数是容器自动调用的,通过这些函数你可以方便的实现BMP和数据库中的数据保持一至,如果你用SessioBean就必须自己写这些保持数据一致的程序,而且你要不时地考虑到它们”能举个简单的例子吗?
      

  3.   

    从代码量来看,差不多的,从设计上讲,Session+JDBC更习惯些
      

  4.   

    代码量是差不多可是在维护性可扩展性上session bean+jdbc就差多了
      

  5.   

    首先,实体Bean与会话Bean肯定是有区别的,这就是你说要知道的区别。不管BMP还是CMP,作为实体Bean,容器总要为之负出代价。生命周期的管理就是其一,什么时候调用ejbStore,什么时候调用ejbLoad,不是你说了算的,是容器决定的。除了容器用你提供的方法来访问数据库以外,其它与CMP没有多大差别。而会话Bean,特别是我们一般是用无状态的会话Bean来处理数据库的,是吧,在调用后会被放回到池里。它与我们平时不用EJB的方法表面上有一点类似(但本质上还是有区别的)。所以你会感觉到它很方便,代码上与BMP差不多,操作上又与以前我们不用EJB时的开发方式差不多,容易上手:)
      

  6.   

    我觉得SessionBean+JDBC来快速访问只读的多条记录是一个比较好的方法,但要修改或更新等操作,它不适合。如果能用CMP就用CMP,如果表的关系实在复杂,而你又只能用EJB1.1,那BMP可能就是你要考虑的了。在J2EE设计模式中有一个复合实体的模式,可用来表述复杂的表关系,它只能用BMP来实现,但是另一本书,好象叫EJB设计模式的,建议不用这个模式,有空你可以自己研究一下吧。J2EE核心模式在SUN的站上有down的,而EJB设计模式在theServerSide有。
      

  7.   

    我觉得SessionBean+JDBC来快速访问只读的多条记录是一个比较好的方法,但要修改或更新等操作,它不适合。如果能用CMP就用CMP,如果表的关系实在复杂,而你又只能用EJB1.1,那BMP可能就是你要考虑的了。在J2EE设计模式中有一个复合实体的模式,可用来表述复杂的表关系,它只能用BMP来实现,但是另一本书,好象叫EJB设计模式的,建议不用这个模式,有空你可以自己研究一下吧。J2EE核心模式在SUN的站上有down的,而EJB设计模式在theServerSide有。
      

  8.   

    那么,请问,我用SESSIONBENA+JDBC方式,对于事务处理方面,我要手工写:
    InitialContext ic = new InitialContext();
      UserTransaction ut = ejbContext.getUserTransaction();
      ut.begin();
    .........如果用BMP,在事务处理方面,是不是就不需要写类似这样的代码了?
      

  9.   

    你在部署的时候就可以配置EJB需要哪些事务了,这不是更容易吗!
      

  10.   

    就是说,对于BMP,我不需要在代码中写事务处理了
    只要在部署文件中写就可以了?
      

  11.   


    奇怪,为什么会话bean就没有容器事务管理了?我怎么总记得一样也有的呀?
      

  12.   

    肯定有,你如果不想自己处理事务,在sessionbean中也可以使用容器管理的事务。
      

  13.   

    sessionbean要是也能做到这一点,那BMP的优势岂不是更少了????sessionbean到底能不能做到使用容器管理的事务呀?如果能,能写几句出来吗?
      

  14.   

    我创建了一个无状态SessionBean,对于数据库的操作,我加上事务处理的代码:    Connection conn=null;
        UserTransaction ut=null;
        PreparedStatement pstm=null;    try{
          InitialContext ic = new InitialContext();
          ut = sessionContext.getUserTransaction();
          ut.begin();
          javax.sql.DataSource ds = (javax.sql.DataSource) ic.lookup("DataSource");
          conn = ds.getConnection();
          String sql="insert into test(name,email) values(?,?)";
          pstm=conn.prepareStatement(sql);
          pstm.setString(1,"John");
          pstm.setString(2,"[email protected]");
          pstm.execute();
          ut.commit();
        }catch(SQLException e){
          System.out.println("SQLException:" + e.getMessage());
        }catch(Exception e){
          System.out.println("Exception:" + e.getMessage());
        }编译、部署都没问题,但在CLIENT端调用这个BEAN的时候,出现下面的异常:
    Exception:Only instances of beans with bean-managed transaction demarcation can use getUserTransaction().是不是不能在无状态SessionBean
      

  15.   

    上例你是不是在部署描述符中还声明的让容器来管理事务,如下:
    <transaction-type>Container</transaction-type>
    应该改为Bean