2013-06-28 20 views
1

我有一個Web應用程序,其中一個RESTful前端生成數據庫中的條目和一個與cron表達式連接的作業激發邏輯來處理記錄。我有關係是Hibernate的session.currentSession()與@Transactional錯誤while session.openSession()不

用戶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

通過快速查看代碼,您可以在if語句中打開會話並基於某些條件。當您使用註釋時,它會在if語句之前打開會話,而不考慮條件。這可能是不同行爲背後的原因。

+0

感謝您的回覆。但是經過進一步的測試,我注意到這種行爲並不是孤立於未註釋的事務。我想我需要爲用戶類添加@Version註釋,以檢測何時刪除通知並將其添加到用戶集合中。我相信它的工作方式是,當版本發生衝突並調用session.refresh()並重試時,我會捕獲異常? – Brian

相關問題