我在spring的事务服务类中做了很少的hibernate save操作。 我的期望是,当方法执行完成时,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行为,以及是否可以告诉hibernate执行它
退出服务方法前的查询
谢谢。
答案 0 :(得分:1)
此行为是由于hibernate优化所致。 Hibernate将等到最后一次执行句子。
您可以使用 session.flush()来避免这种情况,刷新会话会强制Hibernate将Session的内存状态与数据库同步(即将更改写入数据库)。 / p>
答案 1 :(得分:0)
这里的问题是当发生异常时,你的变量/对象没有在catch块中初始化并且你正在访问它。
看起来您刚刚添加了相关代码片段,因此我想变量object1, object2, object3
需要初始化为null
。
例如: object1=null