我在辅助bean中为JSF中的操作按钮定义了一个方法。我使用Hibernate作为ORM。我能够保存新数据。但是当我尝试更新相同的数据时,会抛出事务回滚异常
javax.faces.FacesException: #{itemModificationBean.saveData('0','IM')}: org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:98)
at
我没有为该方法实现任何接口,而是在支持bean本身中调用和定义它。
有没有办法找出出错的地方?....
任何帮助将不胜感激
如果需要更多细节来详细说明问题,请告诉我
支持Bean
ItemBackingBean操作方法
@Transactional(readOnly=false, propagation=Propagation.REQUIRED)
public String saveData(String action, String app) throws WFException {
setSaveOrSubmitStatus(action);
setCurrentApp(app);
//DB operations
.
.
.
.
.
return requestNo
}
组件
<p:commandButton value="#{msg.save}" type="submit" id="modifySav"
process="@form @this"
action="#{itemModificationBean.saveData('0','IM')}"
rendered="#{itemAttributeBean.getRenderedValue('modifySav')}"
update="@([id$=form]) @([id$=collectionTab]) @([id$=itemRequestDetailsGrid]) @([id$=saveDialogItemMod])"
style="float:right;" />
答案 0 :(得分:0)
从你的堆栈跟踪中可以说是
交易已被标记为仅回滚
我会建议这些步骤:
transactionPropagation
策略,因此您需要找到它开始的第一个位置。从我从qestion详细信息中看到的,它可能是从您的支持bean saveData
方法调用的方法,这些方法位于相同的事务上下文中。因此更新本身可能正常工作,但以前的方法调用已标记为当前事务仅作为回滚。检查他们的交易传播策略。
我假设数据库操作之前的某些方法通过某种异常回滚事务或仅将事务显式标记为回滚。这些方法不会抛出异常,这就是程序流继续进行数据库操作方法调用的原因,但不能在同一个事务上下文中完成。