Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 冬眠';s session.currentSession()带有@Transactional errors,而session.openSession()没有';T_Spring_Hibernate_Session_Transactions - Fatal编程技术网

Spring 冬眠';s session.currentSession()带有@Transactional errors,而session.openSession()没有';T

Spring 冬眠';s session.currentSession()带有@Transactional errors,而session.openSession()没有';T,spring,hibernate,session,transactions,Spring,Hibernate,Session,Transactions,我有一个web应用程序,其中一个RESTful前端在数据库中生成条目,一个与cron表达式连接的作业触发逻辑来处理记录。我的关系是 用户1->*通知 发送通知时,通知将被删除。在极少数情况下,如果用户在作业从其通知列表中删除记录时(发送后)收到通知(要持久化),我会在联接表上收到约束冲突,其中联接列必须引用通知表中的通知 public void deleteNotifsInUser(List<Notification> notifsToDelete, User user) {

我有一个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();
    }
}
public void deleteNotifsUser(列出notifsToDelete,用户){
if(user!=null&¬ifsToDelete!=null&¬ifsToDelete.size()>0){
if(log.isDebugEnabled()){
log.debug(notifsToDelete);
}
Session Session=sessionFactory.openSession();
用户userInDb=(用户)会话。合并(用户);
对于(通知n:notifsToDelete){
objectnotifindb=session.merge(n);
userInDb.getNotifications().remove(notifInDb);
删除(通知b);
}
session.close();
}
}

有人能告诉我为什么在这个方法上使用@Transaction会导致与使用API打开会话不同的行为吗?

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

谢谢你的回复。但经过进一步测试,我注意到这种行为并不是孤立于非注释事务的。我认为我需要向by user类添加@Version注释,以检测何时删除通知并将其添加到用户集合。我相信它的工作方式是,当版本冲突时,我会捕获异常并调用session.refresh()然后重试?