您的位置:首页 > 产品设计 > UI/UE

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

2017-01-10 15:32 597 查看
项目中是这样的:页面删除数据,从页面得到那一行数据的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>


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: