2016-04-01 31 views
0

EJBでロールバックを行うのに何時間も費やされました。私はCDIコントローラを持っています。 EJBで削除しようとすると、例外が発生し、ロールバックを試みますが、動作しません。例外を取得する前にコミットで実行されたすべてのSQLはロールバックされません。 Obviusly BMTでロールバックをしようとすると別の例外が発生するためではありません。それ以外の場合はCMTで試してみましたが、休止状態の例外がありますが、BMTと同じ結果が得られます。EJBロールバックはコンテナ管理では動作しませんトランザクションまたはBean Managamentコミット例外のトランザクション

次のように私のコントローラは、EJB BMTで

@Named 
@Stateful 
@ConversationScoped 
public class PRequerimientoConjuntoCertificacionesBean implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1779474550283190942L; 

    @Inject 
    private Conversation conversation; 

    @PersistenceContext(type = PersistenceContextType.TRANSACTION) 
    private EntityManager entityManager; 

    @Inject 
    private DatosSesion datosSesion; 

    public void eliminarDocumento() { 
     // TODO hay que probarlo 
     DocumentoGeneradoSSCC documentoEliminar; 
     try { 
      documentoEliminar = (DocumentoGeneradoSSCC) daoBase 
        .getEntityById(DocumentoGeneradoSSCC.class, 
          10); 
      documentoSSCCDAOBean.removeDocumentoSSCC(documentoEliminar,entityManager); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

です:

@Stateful 
@TransactionManagement(TransactionManagementType.BEAN) 
public class DocumentoSSCCDAOBean implements IDocumentoSSCCDAOBeanLocal { 

    @Resource 
    private UserTransaction userTran; 
    @PersistenceContext(type = PersistenceContextType.TRANSACTION) 
    private EntityManager entityManager; 

    @Override 
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void removeDocumentoSSCC(
      DocumentoGeneradoSSCC documentoGeneradoSSCC, 
      EntityManager entityManager) { 
     // TODO hue probarlo 
     try { 
      userTran.begin(); 
      // Eliminamos recurso asignado 

      entityManager 
        .remove(entityManager.contains(documentoGeneradoSSCC) ? documentoGeneradoSSCC 
          : entityManager.merge(documentoGeneradoSSCC)); 
      userTran.commit(); 
     } catch (Exception e) { 
      try { 
       userTran.rollback(); 
      } catch (IllegalStateException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } catch (SecurityException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } catch (SystemException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
    } 
} 

を、私はこのスタックトレース

し、javax.transaction.RollbackException取得:ARJUNA016053:トランザクションをコミットできませんでしたが。

と私はロールバックを行うにしようとすると、私はこの

java.lang.IllegalStateException取得:BaseTransaction.rollback - ARJUNA016074:なしトランザクションを!

私は真のJTA =とstandloneデータソースを持って、

<datasource jta="true" jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true"> 
    <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url> 
    <driver>h2</driver> 
    <security> 
     <user-name>sa</user-name> 
     <password>sa</password> 
    </security> 
</datasource> 

私のpersistence.xmlが

<persistence-unit name="JusticiaGratuita" 
    transaction-type="JTA"> 
    <!-- <description>Forge Persistence Unit</description> --> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 

    <properties> 
     <property name="hibernate.connection.driver_class" value="${db.driver}" /> 
     <property name="hibernate.connection.url" value="${db.url}" /> 
     <property name="hibernate.connection.username" value="${db.user}" /> 
     <property name="hibernate.connection.password" value="${db.pass}" /> 
     <property name="hibernate.default_schema" value="${db.schema}" /> 

     <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> 
     <property name="hibernate.hbm2ddl.auto" value="validate" /> 

     <property name="hibernate.query.substitutions" value="true 1, false 0,'SI' 1, 'NO' 0" /> 

     <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" /> 
     <property name="hibernate.jdbc.batch_size" value="20" /> 
     <property name="hibernate.cache.use_second_level_cache" 
      value="true" /> 
     <property name="hibernate.cache.use_query_cache" value="false" /> 

     <property name="hibernate.show_sql" value="${db.showSql}" /> 
     <property name="hibernate.format_sql" value="true" /> 

     <property name="hibernate.connection.provider_class" 
      value="org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider" /> 

     <property name="hibernate.c3p0.max_size" value="30" /> 
     <property name="hibernate.c3p0.min_size" value="5" /> 
     <property name="hibernate.c3p0.acquire_increment" value="1" /> 
     <property name="hibernate.c3p0.idle_test_period" value="3000" /> 
     <property name="hibernate.c3p0.max_statements" value="0" /> 
     <property name="hibernate.c3p0.timeout" value="0" /> 
     <property name="hibernate.c3p0.autocommit" value="false" /> 
    </properties> 

</persistence-unit> 

であるあなたはここで私のエラーの完全なスタックトレースを見ることができます:http://pastebin.com/h17JD2xP

I w ouldはロールバックを行い、私の問題を解決する助けに感謝します。

よろしくお願いいたします。

+1

Bean管理のトランザクションが適切な場所にある場合、コンテナ管理のトランザクション属性(REQUIRES_NEW)を持つのは少し矛盾しています。しかし、コンテナはそれを無視するかもしれないと思います。 – Gimby

+0

私が使用しているコンテナ管理のトランザクション属性は必須ですが、Bean管理トランザクションを表示している例です。 –

答えて

0

最後に問題を解決します。ロールバックを行う前に私はコミットを実行するので、この例外が発生していました。コミット後ロールバックを実行することは不可能です。なぜなら、コミットするとトランザクションがなくなり、ロールバックが実行されてもトランザクションがなかったからです。

java.lang.IllegalStateException:BaseTransaction.rollback - ARJUNA016074:トランザクションはありません!

最後に、私はCMTでこのようにすることにしました。

@TransactionManagement(TransactionManagementType.CONTAINER) 
@Stateless 
public class DocumentoSSCCServiceBean implements IDocumentoSSCCServiceBeanLocal { 

    @EJB 
    private IDaoBase daoBase; 

    @PersistenceContext(unitName = "JusticiaGratuita", type = PersistenceContextType.TRANSACTION) 
    private EntityManager entityManager; 

    @Resource 
    private EJBContext ejbContext; 

    @Override 
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public void removeDocumentoSSCC(Long documentoGeneradoSSCC) 
      throws RollbackSajgException { 
     try { 
      // Buscamos el documento a eliminar 
      DocumentoGeneradoSSCC docu = (DocumentoGeneradoSSCC) daoBase 
        .getEntityById(DocumentoGeneradoSSCC.class, 
          documentoGeneradoSSCC); 

      entityManager.remove(docu); 
     } catch (Exception e) { 

      ejbContext.setRollbackOnly(); 
      throw new RollbackSajgException(); 

     } 
    } 
} 

私はこれが何かを助けてくれることを願っています。

関連する問題