Hibernate在提交响应之前不执行查询

时间:2016-10-03 14:20:55

标签: spring hibernate

我在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执行它 退出服务方法前的查询 谢谢。

2 个答案:

答案 0 :(得分:1)

此行为是由于hibernate优化所致。 Hibernate将等到最后一次执行句子。

您可以使用 session.flush()来避免这种情况,刷新会话会强制Hibernate将Session的内存状态与数据库同步(即将更改写入数据库)。 / p>

答案 1 :(得分:0)

这里的问题是当发生异常时,你的变量/对象没有在catch块中初始化并且你正在访问它。

看起来您刚刚添加了相关代码片段,因此我想变量object1, object2, object3需要初始化为null
例如: object1=null