你可以检查一下ICommonEao 这个EJB里的save方法,如果事务传播属性为Required,或者Supports时才可被回滚。其他属性不回滚是正确的。

解决方案 »

  1.   

    说漏了一个Mandatory时,也可被回滚。
      

  2.   


    @Stateless(name = "common_EaoBean")
    @Local
    @TransactionManagement(TransactionManagementType.CONTAINER)
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public class CommonEaoImpl implements ICommonEao { @PersistenceContext(unitName = "CollegePlatformSecurityEntity")
    private EntityManager em;
    这是我commoneao的部分代码,这里也声明了
      

  3.   

        @Resource(mappedName = "common_EaoBean/remote")
        private ICommonEao commonEao;@Stateless(name = "common_EaoBean")
    @Local
    @TransactionManagement(TransactionManagementType.CONTAINER)
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public class CommonEaoImpl implements ICommonEao {注解用的少,代码看着挺疑惑的你确定调用的是CommonEaoImpl么?这个看这个好像是Local,而上面那个配置的貌似是想调Remote接口??
      

  4.   

    另外也需要检查一下save方法的事务传播属性,因为方法上的属性会覆盖类上声明的属性~
      

  5.   

    开始save方法上没有声明事务传播属性,后来我试着加上@TransactionAttribute(TransactionAttributeType.REQUIRED)
    依然无效。
      

  6.   


    <?xml version="1.0" encoding="UTF-8"?>
    <persistence xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
        
    <persistence-unit name="CollegePlatformSecurityEntity" transaction-type="JTA">
       <jta-data-source>java:/MyOracleDS</jta-data-source>  
       <properties> 
          <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
    <property name="hibernate.hbm2ddl.auto" value="update" />
    <property name="hibernate.show_sql" value="true" />
       </properties>
    </persistence-unit>
      
    </persistence>这是我的persistence.xml
      

  7.   


    我试过把commoneao部署在远程和本地
    所以remote和local我都改过,依然无效。
      

  8.   

    其实不用改Local/Remote,这个问题跟是Local接口还是Remote接口关系不大。
    另外,部署在远程server实例时应该还需要指定server实例的ip和端口(也就是说一般应该通过lookup),看你例子上直接通过注入的方式,应该用的还是部署在本server实例中的EJB。我上面的表述可能有不清楚的地方,解释一下:
    CommonEaoImpl 类中标注的name是common_EaoBean:
    @Stateless(name = "common_EaoBean")调用的时候用的mappedName是common_EaoBean/remote,
        @Resource(mappedName = "common_EaoBean/remote")
        private ICommonEao commonEao;name和mappedName虽然是不一样的概念,但是下面对commonEao的调用是否就是用的上面那个ejb(common_EaoBean)呢?也就是说是否有可能调用到其他ejb上去了?我觉得应该检查一下。其他倒是没看出啥问题来~
      

  9.   

    我使用的本地jboss,仅仅在jboss-home\server\default\deploy下部署了我自己用的项目,不存在调到其他ejb的问题。另外是不是我ds文件的问题,如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <datasources>
      <local-tx-datasource>
        <jndi-name>MyOracleDS</jndi-name>
        <connection-url>jdbc:oracle:thin:@192.168.24.249:1521:ORCL</connection-url>

        <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
        <user-name>gxpt1</user-name>
        <password>gxpt1</password>
      
        <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
         
          <metadata>
             <type-mapping>Oracle9i</type-mapping>
          </metadata>
      </local-tx-datasource></datasources>
      

  10.   

    重启电脑,清理缓存,重启Jboss再试