2016-09-26 3 views
0

私はチームメイトが開発したプロジェクトで働いていますが、私は奇妙な問題に直面しています。データベースは決して更新されず、ログにも例外はありません。Spring JpaTransactionManagerでコミットに失敗しました

@Service 
@Transactional 
public class InterventionProjectResultIntegrator implements IInterventionProjectResultIntegrator { 

    private static final ILogger logger = ComponentLogger.getInstance(InterventionProjectResultIntegrator.class); 

    private Dao dao; 
    private String APPLICATION = "APP"; 

    @Autowired 
    public void setDao(Dao dao){ 
    this.dao = dao; 
    } 

    @Override 
    public void integrateResponse() { 

    try { 
     List<ResponseEntity> responseListByStatus = dao.findAllResponseByStatus(Dao.STATUS_EN_COURS, APPLICATION); 

     for (ResponseEntity response: responseListByStatus) { 
     response.setStatus(Dao.STATUS_OK); 
     dao.mergeResponseEntity(response); 
     } 
    } catch (Exception ex) { 
     logger.error(ex.getMessage(), ex); 
     throw ex; 
    } 
    } 
} 

あなたが機能を見ることができるように非常に単純です:ここでは、コードです

  • ループでオブジェクト
  • 更新各オブジェクトの状態
  • 以上のデータベースから

    1. 取得するオブジェクトループコミットの変更の終了

    データベース上でオブジェクトが更新されず、例外もないことを除いて、すべて正常に実行されます。

    Daoは別のプロジェクトでうまくいきましたので、問題は新しい問題と関連していると思います。

    私は、コンソールで次のログを見ることができます:

    org.springframework.transaction.support.TransactionSynchronizationManager - Retrieved value [[email protected]] for key [org[email protected]713e49c3] bound to thread org.hibernate.event.internal.AbstractSaveEventListener - Persistent instance of: com.domain.ResponseEntity 
    org.hibernate.event.internal.DefaultMergeEventListener - Ignoring persistent instance 
    org.hibernate.action.internal.UnresolvedEntityInsertActions - No entity insert actions have non-nullable, transient entity dependencies. 
    

    はすでに同様の問題に直面しましたか?

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

    [EDIT 1]

    はコメントで指摘したように、私は@Transactionalアノテーションで取扱説明書のトランザクションを置き換えます。更新されたコードを参照してください。

    これでログに新しい行が追加されましたが、同じ結果、オブジェクトはデータベースに保存されません。

    org.springframework.transaction.interceptor.TransactionAspectSupport - Completing transaction for [com.response.InterventionProjectResultIntegrator.integrateResponse] 
    

    DAOソースに尋ねられました。このコードは私の責任の下ではなく、別の文脈で魅力的に働いていました。示唆したように

    @Repository 
    public class Dao { 
        public static final ILogger logger = ComponentLogger.getInstance(Dao.class); 
    
        public static final String STATUS_EN_COURS = "PENDING"; 
        public static final String STATUS_OK = "OK"; 
        public static final String STATUS_ERROR = "ERROR"; 
    
        @PersistenceContext 
        protected EntityManager entityManager; 
    
        public void setEntityManager(EntityManager entityManager) { 
        this.entityManager = entityManager; 
        } 
    
        public void mergeMvzResponseEntity(ResponseEntity responseEntity) { 
        if(entityManager != null) { 
         this.entityManager.merge(responseEntity); 
        } else { 
         logger.error("Entity manager not initialized"); 
        } 
    } 
    
  • +1

    あなたのDAOを追加してください。あなたのコードにも欠陥があります。例外がある場合は、トランザクションをロールバックする必要があります。現在、接続リークが発生しています。また、なぜ自分で取引を管理しているのですか?単純にメソッドをトランザクショナルにするだけで、バネに処理させ、面倒なtxコードを書いてしまうのを防ぎます。 –

    +0

    @ M.Deinumここにあなたが求めた情報があります。あなたの助言に従い、トランザクションアノテーションを使用することに決めましたが、問題を解決しません。 – Darwiin

    答えて

    0

    、私は@Transactionalアノテーションを使用して、春のハンドルトランザクションのものをできるようにソースコードを再加工しています

    :その後、私のXML設定ファイルに次の行を追加
    @Service 
    @Transactional 
    public class InterventionProjectResultIntegrator implements IInterventionProjectResultIntegrator { 
    
        private static final ILogger logger = ComponentLogger.getInstance(InterventionProjectResultIntegrator.class); 
    
        private Dao dao; 
        private String APPLICATION = "APP"; 
    
        @Autowired 
        public void setDao(Dao dao){ 
        this.dao = dao; 
        } 
    
        @Override 
        public void integrateResponse() { 
    
        try { 
         List<ResponseEntity> responseListByStatus = dao.findAllResponseByStatus(Dao.STATUS_EN_COURS, APPLICATION); 
    
         for (ResponseEntity response: responseListByStatus) { 
         response.setStatus(Dao.STATUS_OK); 
         dao.mergeResponseEntity(response); 
         } 
        } catch (Exception ex) { 
         logger.error(ex.getMessage(), ex); 
         throw ex; 
        } 
        } 
    } 
    

    <tx:annotation-driven/> 
    

    これは魅力的なように機能します。 @Mに感謝します。デイナムはそれを指摘した。

    関連する問題