2012-02-15 212 views
0

我有一个Spring/JPA/Hibernate应用程序,并且有一段代码被石英作业每分钟调用一次以发送一些通知。春季休眠不更新实体

@Transactional 
public void sendNotifications(){ 
    Set<MyEntity> entitySet = getDAO().findEntitiesToNotify(); 
    for (MyEntity e : entitySet) { 
     sendEntityNotificationEmail(e); 
     e.setNotification(true); 
     this.merge(e); 
    } 
    return false; 
} 

这在大部分时间都可以正常工作。关键短语是“大部分时间”,因为有时这个事务不会更新数据库,所以每分钟都会发送通知电子邮件,直到我手动执行并终止石英作业或更新数据库为止。日志中没有错误,数据库也没有更新。有没有人对这个问题有什么想法?或者我可以调试这个问题的任何方式。是否有一些竞争条件发生,因为这种方法每隔一分钟就调用一次,所以一个新线程再次调用同一个任务,而另一个正在处理它,因此这个改变不会持久?

+1

如何void方法返回布尔?似乎你在发布问题时忘记了一些细节。 – 2012-02-15 08:20:36

+1

为什么合并而不保存更新? – Firo 2012-02-15 11:05:50

+1

为什么合并而不是持续?最终会使用“flush()”,写更多的代码 – darek 2012-02-15 13:51:13

回答

0

它可以更好地在其他线程发送通知不是再次从数据库中获得实体,更新实体状态并保存