我在Spring的事務服務類中做了很少的hibernate保存操作。 我的期望是,當方法執行完成時,hibernate應該將數據寫入數據庫。 但是,只有當控制器即將返回響應時,hibernate纔會實際執行這些查詢。直到響應被提交後,Hibernate才執行查詢
我的示例代碼如下。
@Controller
public class TestController {
@Autowired
private SaveService saveService;
@RequestMapping(value = "saveData", method = RequestMethod.POST)
public String saveData(HttpServletRequest request, Model model) {
try {
saveService.saveData(object1, object2, object3); // LINE 1
sendEmail(); // LINE 2
//some code here // LINE 3
} catch(Exception e) {
//log exception
//return error message
}
}
}
@Service("saveService")
@Transactional
public class SaveServiceImpl implements SaveService {
@Autowired
private SaveDAO saveDAO;
public void saveData(Object objec1, Object objec2, Object objec3) {
saveDAO.save(object1);
saveDAO.save(object2);
saveDAO.save(object3);
}
}
在上面的代碼中,我從控制器調用SaveService.saveData()方法。如果保存成功,我想繼續併發送電子郵件。但如果由於某種原因SaveService.saveData()拋出一個異常,我不想 發送電子郵件。
當我執行一些測試時,發現即使SaveService.saveData()拋出異常,它也不會拋出 ,直到從控制器發送電子郵件。
我希望如果在控制器 的'LINE 1'處調用saveService.saveData()時引發異常,則不應執行發送電子郵件的下一行。
我想知道這是否是預期的休眠行爲,以及是否可以在退出服務方法之前告訴hibernate執行 查詢。
謝謝。
對不起,我不明白爲什麼它不起作用。但我可以建議你使用'@ TransactionalEventListener' [(Details here)](https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2#事務綁定事件)在事務提交或回滾後立即執行一些操作 – Dekart
拋出哪個異常?我猜它的NullPointerException。 –
謝謝@Dekart。瀏覽你分享的鏈接。 – ivish