私はチームメイトが開発したプロジェクトで働いていますが、私は奇妙な問題に直面しています。データベースは決して更新されず、ログにも例外はありません。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;
}
}
}
あなたが機能を見ることができるように非常に単純です:ここでは、コードです
- 取得するオブジェクトループコミットの変更の終了
データベース上でオブジェクトが更新されず、例外もないことを除いて、すべて正常に実行されます。
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");
}
}
あなたのDAOを追加してください。あなたのコードにも欠陥があります。例外がある場合は、トランザクションをロールバックする必要があります。現在、接続リークが発生しています。また、なぜ自分で取引を管理しているのですか?単純にメソッドをトランザクショナルにするだけで、バネに処理させ、面倒なtxコードを書いてしまうのを防ぎます。 –
@ M.Deinumここにあなたが求めた情報があります。あなたの助言に従い、トランザクションアノテーションを使用することに決めましたが、問題を解決しません。 – Darwiin