InvalidDataAccessApiUsageException: Executing an update/delete query 解决办法

来源:互联网 发布:red5源码 教程 编辑:程序博客网 时间:2024/06/05 20:04

项目中是这样的:页面删除数据,从页面得到那一行数据的id,一直传进后台类的impl实现类,实现类中是一个dao去执行一个hql的delete语句,因为不是根据id删除的,是根据header_id删除的,没有现成的包装方法,之鞥自己写hql,如下:

@Modifying @Query("delete ReportingWeekDetail where header.id=?1")public void delByHeader(Integer headerid);

然后就报错,Executing an update/delete query,

1,一开始以为是hql不对,后面的问号后面还有个1,其实不是那里的错,1是下标,表示接受传进来的第一个参数,就想jdbc中PreparementStatement传参用问号一样;

,2,然后我看了下header.id似乎不对,因为表中的header.id字段不是点,是下划线,是header_id,改了后,还是不行;

于是请教了大神,但因为每个人懂的领域不同,而且hibernate用的不多了,大神也不太懂,折磨了许久之后到了下午,偶尔找到了一篇博文,找到了答案;

Executing an update/delete query 报错是因为没有事务,

解决办法1:在@Modifying后面加@Transactional

@Modifying@Transactional @Query("delete ReportingWeekDetail where header.id=?1")public void delByHeader(Integer headerid);

解决办法2:采用AOP声明式事务管理

<tx:advice id="dao" transaction-manager="transactionManager">          <tx:attributes>              <tx:method name="deleteByUserId*" read-only="false"/>                             <!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到session-->                 <tx:method name="*"  propagation="REQUIRED" /><!-- 他就是允许所有的方法都有session <tx:method name="*"  propagation="REQUIRED" />-->             </tx:attributes>  </tx:advice>           <aop:config>          <aop:pointcut id="daoMethods" expression="execution(* com.hblb.develop.repository..*.*(..))"/><!--第二种 expression="execution(* com.service.*.*(..))"  。。代表service下的所有  -->          <aop:advisor advice-ref="dao" pointcut-ref="daoMethods" />      </aop:config>   


 



 

0 0
原创粉丝点击