1

RESTful フロント エンドがデータベース内のエントリを生成し、cron 式に関連付けられたジョブがロジックを起動してレコードを処理する Web アプリがあります。私が持っている関係は

ユーザー 1 -> * 通知

通知が送信されると、それらは削除されます。まれに、ジョブが通知のリストからレコードを削除しているときにユーザーが通知を受信した場合 (送信後)、結合列が通知を参照する必要がある結合テーブルで制約違反が発生します。通知テーブル。

 public void deleteNotifsInUser(List<Notification> notifsToDelete, User user) {
    if(user != null && notifsToDelete != null && notifsToDelete.size() > 0) {
      if(log.isDebugEnabled()) {
        log.debug(notifsToDelete);
      }

      Session session = sessionFactory.openSession();

      User userInDb = (User) session.merge(user);

      for (Notification n : notifsToDelete) {
        Object notifInDb = session.merge(n);
        userInDb.getNotifications().remove(notifInDb);
        session.delete(notifInDb);
      }

      session.close();
    }
}

このメソッドで @Transaction を使用すると、API を使用してセッションを開く場合とは異なる動作が発生する理由を誰か教えてもらえますか?

4

1 に答える 1

0

コードをざっと見て、if ステートメント内でセッションを開き、いくつかの条件に基づいています。注釈を使用すると、条件に関係なく、if ステートメントの前にセッションが開きます。それがさまざまな行動の背後にある理由かもしれません。

于 2013-06-28T01:36:44.207 に答える