如果确认你的语句没有问题

原因

经过一番代码确认后 发现实际上我的语句和我之前的语句在程序执行过后都没有立即执行 而我的语句依赖于我之前的代码先执行完

这里就猜到了数据没有被提交到数据库,在事务实际提交到数据库中执行后 我的语句在我依赖的语句之前执行 导致没有实际效果,也就是Hibernate 是批量将事务提交到数据库后,由于提交顺序和程序中的顺序不一致导致结果不成功

在使用 Hibernate 时由于事务是批量提交到数据库去执行的,这样相当于是一种优化,减少了交流次数。

解决方式

INSERT, UPDATE, DELETE 这类操作混合使用或者多次使用时,可能 由于顺序问题导致数据更新异常。

第一种解决方式
为了保证数据的准确性,直接在代码中使用 类似于
(使用以上的其中一种即可)

session.flush()

session.beginTransaction().commit();

session.beginTransaction();

等方式将数据手动刷到数据库后再执行相关操作,即可保证数据的顺序执行是正确的。

第二种解决方式

.getCurrentSession().createSQLQuery(sql);   // 返回 SQLQuery 对象

修改为

.getCurrentSession().createQuery(sql);    // 返回 Query 对象

区别

createQuery:
以 hql语句进行查询,hibernate生成的Bean为对象装入list返回

createSQLQuery
以sql语句查询,以对象数组进行存储。

第三种解决方式
不太靠谱,但是可以一试

查看当前项目的事务配置,我发现自己的方法名事务开头位于我依赖的语句的方法的开头之前,于是我在使用第二种方法的同时修改了我的方法名

例如:
我的方法名为 execute方法开头
我依赖的语句为 update

但是在我的项目事务配置中 update配置位置位于 execute之后,所以我修改我的任务名称开头为 update。
最终我使用了方法二 和 三 最终测试结果成为了我预定的结果。 问题解决