老兄,只有在bean管理事务的情况下,才能调用getUserTransaction().把你的
bean的事务类型设为:Bean就可以了。
  <transaction-type>Bean</transaction-type>

解决方案 »

  1.   

    那我要是想用sessionbean+Jdbc完成项目的话
    没办法使用事务吗?
      

  2.   

    可以,但不能调用SessionContext.getUserTransaction();Connection.begin();Connection.commit();Connection.rollback().容器会自动处理事务,事务的边界由你为每个方法设定的事物属性决定,不能用上面的方法自己设定事务边界。当方法抛出系统异常(EJBException及其子类)时,或调用SessionContext.RollbackOnly()时,事务回滚;否则事务提交。另外,你可以通过实现会话同步接口(SessionSynchronization)来获得更多的事务通知:
      afterBegin();事务开始后调用
      beforeCommit();事务提交前
      afterCommit(boolean flag);事务提交后(flag=true),或事务回滚后(flag=false).
      

  3.   

    可是,我把我的这个BEAN的ejb-jar.XML配置文件,改成
    <transaction-type>Bean</transaction-type>
    然后把
    <assembly-descriptor>
    ......
    </assembly-descriptor>
    删掉,
    再用:SessionContext.getUserTransaction();
    就成功了
    这是为什么?
      

  4.   

    第一:把bean的事务类型设为:Bean,就是bean管理事务,需要自己定义事务边界。SessionContext.getUserTransaction();Connection.begin();Connection.commit();Connection.rollback().都允许使用。但SessionContext.RollbackOnly()和SessionContext.isRollbackOnly()是禁止使用的。所以一改为<transaction-type>Bean</transaction-type>你的程序就OK了。这就是我第一贴的意思。
    第二:第二贴是看见你的回贴,以为你要使用容器管理事务。那是容器管理b事务情况下的办法,也就是当<transaction-type>Container</transaction-type>时。
       两种都是可以的,就看你选哪个了,不存在冲突。
      

  5.   

    那请问,用
    SessionContext.getUserTransaction()来处理事务,和
    用Connection.begin
    这两者的躯体区别是什么?
    在什么样的情况下需要正确的选择他们中的那一个?
      

  6.   

    那看你的具体用途了,如果在一个事务中只涉及数据库操作,则用Connection.begin()足以,如:
      ......
      Connection.begin();
      数据库操作....
      Connection.commit();/Connection.rollback();
    如果事务中用到了其他资源,包括JMS,调用其它bean的远程方法,数据库操作。则要用SessionContext.getUserTransaction()来处理事务。
     
      

  7.   

    最好再问一下,就结帐 :)用这种方式来写项目,和用BMP,有什么区别吗?比如,既然SESSIONBEAN+JDBC实现了事务支持,那用BMP还有什么特殊的好处吗?
      

  8.   

    这不是一个概念,SessionBean建摸工作流,代表一次会话,作为客户端的代理完成特定的业务逻辑,Stateful SessionBean在整个生命周期中属于同一个客户端,不能被多个客户端共享;而Entitybean建模持久性的商务对象,为客户端提供快速、高效和可重用的数据访问接口,虽然BMP自己管理持久性,但依然可以利用系统提供的非配置性服务,如:实例池、并发管理等,从而提高速度,保证数据一致性。
     也就是说,Entitybean侧重于访问数据的高速和一致性;SessionBean侧重于商务逻辑,在事务、安全等方面较强。
     因为Entitybean需要较多的系统资源,也有人提出不用Entitybean,而全用SessionBean,主要是无状态的SessionBean。但我认为,用J2EE就是利用其提供的系统及服务来减少编程,所以我认为一个系统中的关键性持久性对象应该用Entitybean来实现,如一个教学管理系统中的学生对象,其它的次要对象则最好不用Entitybean,而用Stateless Sessionbean实现。
     这是我随便写的,见笑了,女朋友喊去吃饭,再见。
      

  9.   

    你说的“如一个教学管理系统中的学生对象,其它的次要对象则最好不用Entitybean,而用Stateless Sessionbean实现”
    这是什么意思?为什么?
    能说详细点吗?
      

  10.   

    因为因为Entitybean需要较多的系统资源,如果不分情况一律用Entitybean的话,系统一大你的服务器就吃不消了。