Hibernate的session.currentSession()与@Transactional错误,而session.openSession()没有

时间:2013-06-28 01:28:14

标签: spring hibernate session transactions

我有一个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​​打开会话不同的行为?

1 个答案:

答案 0 :(得分:0)

通过快速查看代码,您可以在if语句中打开会话并基于某些条件。使用注释时,它会在if语句之前打开会话,而不管条件如何。这可能是不同行为背后的原因。