hibernate插入、删除执行顺序问题

xijie00 2017-12-11 12:09:24
SSH框架
下面的代码先保存一个对象,然后根据sql再删除这条记录
public void AsynService(){
McNcTestCustomer customer = new McNcTestCustomer();
customer.setKunnr("DN");

commonDao.save(customer);
String sql = "DELETE FROM MC_NC_TEST_CUSTOMER WHERE KUNNER = 'DN'";
commonDao.updateSQLExecute(sql, null);

}

commonDao.save()方法
public void save(Object pObject) {
this.getHibernateTemplate().saveOrUpdate(pObject);
}

commonDao.updateSQLExecute()方法
public int updateSQLExecute(String sql, Object object) {
Query query = this.getCurrentSession().createSQLQuery(sql);
if (object != null) {
query.setProperties(object);
}
return query.executeUpdate();
}

后台打印hibernate的sql时,发现总是先执行delete语句,然后在执行insert,在数据库里查到这条记录还存在,这是为什么呢?
...全文
478 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xijie00 2017-12-12
  • 打赏
  • 举报
回复
引用 3 楼 mymy1026 的回复:
hibernate的坑之一,同一事物中,在commit事务的时候总是先按 删-改-查的顺序执行,意思就是同一事务中你即使把删除写到最后仍是最先执行删除语句。如果需要先执行保存,请在save方法后执行flush方法提交sql到数据库。
的确需要手动执行flush后就会提交数据库了
dong_19890208 2017-12-11
  • 打赏
  • 举报
回复
那是因为commonDao.updateSQLExecute(sql, null);不受spring的事务管理立即生效,而commonDao.save(customer);方法是收事务管理控制的,当整个方法执行完后才正真生效。所以最后的执行效果就是先删除在插入了
dong_19890208 2017-12-11
  • 打赏
  • 举报
回复
引用 2 楼 mymy1026 的回复:
引用 1 楼 dong_19890208 的回复:
那是因为commonDao.updateSQLExecute(sql, null);不受spring的事务管理立即生效,而commonDao.save(customer);方法是收事务管理控制的,当整个方法执行完后才正真生效。所以最后的执行效果就是先删除在插入了
你怎么知道更新没事务所以立即生效的?
实践证明的
  • 打赏
  • 举报
回复
hibernate的坑之一,同一事物中,在commit事务的时候总是先按 删-改-查的顺序执行,意思就是同一事务中你即使把删除写到最后仍是最先执行删除语句。如果需要先执行保存,请在save方法后执行flush方法提交sql到数据库。
  • 打赏
  • 举报
回复
引用 1 楼 dong_19890208 的回复:
那是因为commonDao.updateSQLExecute(sql, null);不受spring的事务管理立即生效,而commonDao.save(customer);方法是收事务管理控制的,当整个方法执行完后才正真生效。所以最后的执行效果就是先删除在插入了
你怎么知道更新没事务所以立即生效的?

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧