1

我有一个 Web 应用程序,其中一个 RESTful 前端在数据库中生成条目,并且一个使用 cron 表达式连接的作业触发逻辑来处理记录。我的关系是

用户 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 回答