我有一个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打开会话不同的行为?
答案 0 :(得分:0)
通过快速查看代码,您可以在if语句中打开会话并基于某些条件。使用注释时,它会在if语句之前打开会话,而不管条件如何。这可能是不同行为背后的原因。