javax.persistence.TransactionRequiredException: Executing an update/delete query
at org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:96)
at bp.impl.zby.ZbyGoodsManageBpImpl.savePackageTicketsStrip(ZbyGoodsManageBpImpl.java:2066)
at bp.impl.zby.ZbyGoodsManageBpImpl.saveTicket(ZbyGoodsManageBpImpl.java:2033)
at bp.impl.zby.ZbyGoodsManageBpImpl.saveGoods(ZbyGoodsManageBpImpl.java:223)
at controllers.remote.supplier.ZbyGoodsManageController.saveGoods(ZbyGoodsManageController.java:356)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:750)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:708)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:684)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:679)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:172)
at play.server.PlayHandler$NettyInvocation.execute(PlayHandler.java:237)
at play.Invoker$Invocation.run(Invoker.java:264)
at play.server.PlayHandler$NettyInvocation.run(PlayHandler.java:217)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:744)
上面代碼的異常原因就是:執行insert操作沒有開始事務
修改填如下即可,下面是play框架裏面jpa執行的操作,不同的框架,不同的情況會有所不同,
導致異常的異常原因就是上述原因了
JPA.em().clear();
//開啓事務
if(!JPA.em().getTransaction().isActive()){
JPA.em().getTransaction().begin();
}
需要執行的insert語句,此處不再粘貼過來了
//提交事務
JPA.em().getTransaction().commit();
備註:
需要啓用事務,因爲在執行update操作
需要看一下em有沒有beginTransaction()之類的方法。
1、如果有使用spring,可以在這個方法體上加上註解:@Transactional
2、在執行query.executeUpdate();的之前增加一句em.joinTransation();