I am using Hibernate 4.2.21 on websphere 8.5.5.4 running on Java 6
Database: Microsoft SQL Server 2012
Sometimes, when I try to update an entity using the following code:
this.transaction.begin();
// lots of lines of code here before the merge
merge(carentrypermitrequest);
this.transaction.commit(); // exception here
I get the following exception:
javax.transaction.RollbackException
at com.ibm.tx.jta.impl.TransactionImpl.stage3CommitProcessing(TransactionImpl.java:1268)
at com.ibm.tx.jta.impl.TransactionImpl.processCommit(TransactionImpl.java:1042)
at com.ibm.tx.jta.impl.TransactionImpl.commit(TransactionImpl.java:963)
at com.ibm.ws.tx.jta.TranManagerImpl.commit(TranManagerImpl.java:439)
at com.ibm.tx.jta.impl.TranManagerSet.commit(TranManagerSet.java:191)
at com.ibm.ws.tx.jta.UserTransactionImpl.commit(UserTransactionImpl.java:302)
at com.dataserve.mci.bean.license.CarEntryPermitRequestBean.completeAction(CarEntryPermitRequestBean.java:1525)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:328)
at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:341)
at org.jboss.el.parser.AstPropertySuffix.invoke(AstPropertySuffix.java:58)
at org.jboss.el.parser.AstValue.invoke(AstValue.java:96)
at org.jboss.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(Unknown Source)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(Unknown Source)
at com.sun.faces.application.ActionListenerImpl.processAction(Unknown Source)
at org.primefaces.application.DialogActionListener.processAction(DialogActionListener.java:45)
at javax.faces.component.UICommand.broadcast(Unknown Source)
at javax.faces.component.UIViewRoot.broadcastEvents(Unknown Source)
at javax.faces.component.UIViewRoot.processApplication(Unknown Source)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(Unknown Source)
at com.sun.faces.lifecycle.Phase.doPhase(Unknown Source)
at com.sun.faces.lifecycle.LifecycleImpl.execute(Unknown Source)
at javax.faces.webapp.FacesServlet.service(Unknown Source)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1230)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:779)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:136)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:97)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:100)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at com.filenet.ae.toolkit.server.servlet.filter.PostprocessorFilter.doFilter(PostprocessorFilter.java:38)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at com.filenet.ae.toolkit.server.servlet.filter.ContainerBasedFilter.doFilter(ContainerBasedFilter.java:218)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at com.filenet.ae.toolkit.server.servlet.filter.PreprocessorFilter.doFilter(PreprocessorFilter.java:91)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at com.filenet.ae.toolkit.server.servlet.filter.SecurityPluginFilter.doFilter(SecurityPluginFilter.java:202)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at com.filenet.ae.toolkit.server.servlet.filter.ThreadLocalCleanupFilter.doFilter(ThreadLocalCleanupFilter.java:50)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at com.dataserve.common.CompatibleFilter.doFilter(CompatibleFilter.java:53)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:964)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1104)
at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3901)
at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:981)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:200)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:463)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:530)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:316)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:287)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1865)
This is how I get the session factory:
protected SessionFactory getSessionFactory() {
try {
return (SessionFactory) new InitialContext().lookup("SessionFactory");
} catch (Exception e) {
log.error("Could not locate SessionFactory in JNDI", e);
throw new IllegalStateException("Could not locate SessionFactory in JNDI");
}
}
This is how I get the transaction:
public final UserTransaction transaction = getUserTransaction();
protected UserTransaction getUserTransaction() {
try {
return (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction");
} catch (NamingException e) {
e.printStackTrace();
System.err.println("Could not locate UserTransaction in JNDI" + e.getMessage());
throw new IllegalStateException("Could not locate UserTransaction in JNDI");
}
}
Here is the merge method:
public CarEntryPermitRequest merge(CarEntryPermitRequest detachedInstance) {
try {
CarEntryPermitRequest result = (CarEntryPermitRequest) sessionFactory.getCurrentSession()
.merge(detachedInstance);
return result;
} catch (RuntimeException re) {
throw re;
}
}
and the completeAction()
method:
public void completeAction() {
try {
Map fields = new HashMap();
RequestContext requestContext = RequestContext.getCurrentInstance();
RequestContext.getCurrentInstance().addCallbackParam("isValid", Boolean.valueOf(true));
this.transaction.begin();
if (stepNumber == null) {
if (numberOfUploadedFiles < 2) {
addErrorMessage("error1", null, true);
return;
}
requestContext.addCallbackParam("step", new Integer(1));
requestContext.addCallbackParam("isValid2", true);
if (carentrypermitrequest == null)
carentrypermitrequest = new CarEntryPermitRequest();
carentrypermitrequest.setRequesterUserName(loggedInUserId);
carentrypermitrequest.setRequesterName(empName);
carentrypermitrequest.setRequesterDepartmentName(empDept);
carentrypermitrequest.setRequesterMobile(empMobile);
carentrypermitrequest.setRequesterEmail(empEmail);
carentrypermitrequest.setRequestDate(new Date());
carentrypermitrequest.setRequestStatus(CarEntryPermitRequestStatusEnum.PENDING.getValue());
if (destination == null) {
addErrorMessage("error2", null, true);
requestContext.addCallbackParam("isValid", Boolean.valueOf(false));
requestContext.addCallbackParam("isValid2", false);
this.transaction.commit();
return;
}
if (empName == null || empName.equals("")) {
addErrorMessage("error3", null, true);
requestContext.addCallbackParam("isValid", Boolean.valueOf(false));
requestContext.addCallbackParam("isValid2", false);
this.transaction.commit();
return;
}
if (empMobile == null || empMobile.equals("")) {
addErrorMessage("error4", null, true);
requestContext.addCallbackParam("isValid", Boolean.valueOf(false));
requestContext.addCallbackParam("isValid2", false);
this.transaction.commit();
return;
}
if (empBuild.equals("error5")) {
addErrorMessage("error6", null, true);
requestContext.addCallbackParam("isValid", Boolean.valueOf(false));
requestContext.addCallbackParam("isValid2", false);
this.transaction.commit();
return;
}
try {
if (carcategoryvalue == -1 || carcategoryvalue == null || cartypevalue == null
|| cartypevalue == 0) {
addErrorMessage("error7", null,
true);
requestContext.addCallbackParam("isValid", Boolean.valueOf(false));
requestContext.addCallbackParam("isValid2", false);
this.transaction.commit();
return;
}
} catch (Exception e) {
AppLogger.Log(e);
addErrorMessage("error8", null, true);
requestContext.addCallbackParam("isValid", Boolean.valueOf(false));
this.transaction.commit();
return;
}
if (plateNumerSplited[0].trim().equals("") || plateNumerSplited[1].trim().equals("")) {
addErrorMessage("error9", null, true);
requestContext.addCallbackParam("isValid", Boolean.valueOf(false));
requestContext.addCallbackParam("isValid2", false);
this.transaction.commit();
return;
}
platenumber = getPlateString(plateNumerSplited);
if (carentrypermitrequesthome.isPlateHasPendingRequest(platenumber)) {
addErrorMessage("error10", null,
true);
requestContext.addCallbackParam("isValid", Boolean.valueOf(false));
requestContext.addCallbackParam("isValid2", false);
this.transaction.commit();
return;
}
if (destination.equals(DESTINATION_EMPLOYEE)) {
IoEmployees employee = ioemployeeHome.findByUserId(loggedInUserId);
if (employee != null) {
if (employee.getEmpMobile() == null || employee.getEmpMobile().trim().length() == 0) {
employee.setEmpMobile(empMobile);
ioemployeeHome.merge(employee);
}
carentrypermitrequest.setEmployee(employee);
}
carentrypermitrequest.setPlatenumber(platenumber);
if (StringUtils.isNotBlank(employeeNumber))
carentrypermitrequest.setEmployeeNumber(Integer.parseInt(employeeNumber.trim()));
if (StringUtils.isNotBlank(empExt))
carentrypermitrequest.setExt(Integer.parseInt(empExt.trim()));
CarType cartypeobj = cartypehome.findById(cartypevalue);
carentrypermitrequest.setCartypeId(cartypeobj);
carentrypermitrequest.setPermissioncase("under process");
CarCategory carcategoryobj = carcategoryehome.findById(carcategoryvalue);
carentrypermitrequest.setCarcategoryId(carcategoryobj);
CarColor carcolorobj = carcolorhome.findById(carcolorvalue);
carentrypermitrequest.setCarcolorId(carcolorobj);
carentrypermitrequest.setCarmodel(model);
carentrypermitrequest.setNotes(notes);
permitRequestDate = permitRequestDate.replace("/", "");
carentrypermitrequest.setPermitRequestDate(new Integer(permitRequestDate));
carentrypermitrequest.setEmpbuilding(empBuild);
carentrypermitrequesthome.attachDirty(carentrypermitrequest);
this.transaction.commit();
requestId = carentrypermitrequest.getCarentrypermitrequestId();
String subject = "aaaaaaaa " + empName + " - bbbbbbbb : " + empMobile;
fields.put("F_Subject", subject);
fields.put("processType", PageCodeBase.PROCCESS_TYPES.CARENTRY.getCode());
fields.put("processID", carentrypermitrequest.getCarentrypermitrequestId());
fields.put("sendto", DESTINATION_EMPLOYEE);
fields.put("carentrypermitrequestID", carentrypermitrequest.getCarentrypermitrequestId());
fields.put("Building", empBuild.equals("المبنى الرئيسي") ? 1 : 2);
empMobileDisable = true;
}
if (destination.equals(DESTINATION_NOT_EMPLOYEE)) {
if (empDept == null || empDept.equals("")) {
addErrorMessage("aaaaaaaaaaa", null, true);
requestContext.addCallbackParam("isValid2", false);
this.transaction.commit();
return;
}
if (empNumber == null || empNumber.equals("")) {
addErrorMessage("vvvvvvvvvv ", null, true);
requestContext.addCallbackParam("isValid2", false);
this.transaction.commit();
return;
}
IoDepartments deptid = new IoDepartmentsHome().findByName(empDept);
carentrypermitrequest.setEmpdeptoutministry(deptid);
carentrypermitrequest.setEmpnameoutministry(empName);
carentrypermitrequest.setEmpnumoutministry(empNumber);
carentrypermitrequest.setEmpmobileoutministry(empMobile);
carentrypermitrequest.setEmpemailoutministry(empEmail);
carentrypermitrequest.setPlatenumber(platenumber);
CarType cartypeobj = cartypehome.findById(cartypevalue);
carentrypermitrequest.setCartypeId(cartypeobj);
carentrypermitrequest.setPermissioncase("تحت الأجراء");
CarCategory carcategoryobj = carcategoryehome.findById(carcategoryvalue);
carentrypermitrequest.setCarcategoryId(carcategoryobj);
CarColor carcolorobj = carcolorhome.findById(carcolorvalue);
carentrypermitrequest.setCarcolorId(carcolorobj);
carentrypermitrequest.setCarmodel(model);
carentrypermitrequest.setNotes(notes);
permitRequestDate = permitRequestDate.replace("/", "");
carentrypermitrequest.setPermitRequestDate(new Integer(permitRequestDate));
carentrypermitrequest.setEmpbuilding(empBuild);
carentrypermitrequesthome.attachDirty(carentrypermitrequest);
this.transaction.commit();
requestId = carentrypermitrequest.getCarentrypermitrequestId();
String subject = "gggggggggg " + empName + " - tttttttttt: " + empMobile;
fields.put("F_Subject", subject);
fields.put("processType", PageCodeBase.PROCCESS_TYPES.CARENTRY.getCode());
fields.put("processID", carentrypermitrequest.getCarentrypermitrequestId());
fields.put("sendto", DESTINATION_NOT_EMPLOYEE);
fields.put("carentrypermitrequestID", carentrypermitrequest.getCarentrypermitrequestId());
fields.put("Building", empBuild.equals("المبنى الرئيسي") ? 1 : 2);
empMobileDisable = true;
}
processHandler.doLaunch(fields);
String queueName = "";
if (empBuild.equals(MAIN_BUILDING_VALUE)) {
queueName = MAIN_BUILDING_QUEUE;
} else if (empBuild.equals(BUSINESS_BUILDING_VALUE)) {
queueName = BUSINESS_BUILDING_QUEUE;
}
List<String> toList = getPublicInboxUsersEmails(queueName);
String mailSubject = "eeeeeeeeeeeee";
String mailBody = createMailBodyForNewRequest();
String imageName = "moamalatIcon.jpg";
String bannerPath = NotificationThread.class.getResource(imageName).getPath();
NotificationThread thread = new NotificationThread(toList, mailSubject, mailBody, configs, bannerPath);
thread.start();
String[] paramsArray = { carentrypermitrequest.getPlatenumber(), requestId.toString(),
GeneralUtils.getConfig("CAR_INQUIRE_URL") };
sendSMSNotificaiton(empMobile, ProcessConstant.SMS_CODE_CAR_PASS_RECEIVED, paramsArray);
}
else if (stepNumber == STEP_NUMBER_EMPLOYEE_ACTION) { // security manager step
requestContext.addCallbackParam("isValid2", true);
Integer carentrypermitrequestID = (Integer) processHandler.getStepElement()
.getParameterValue("carentrypermitrequestID");
if (dManaSecurityApprove == null || dManaSecurityApprove == 0) {
addErrorMessage("yyyyyyyyyy", null, true);
requestContext.addCallbackParam("isValid", Boolean.valueOf(false));
requestContext.addCallbackParam("isValid2", false);
return;
}
if ((permissiondate == null || permissiondate.trim().length() == 0 || permissionenumber == null
|| permissionenumber.trim().length() == 0) && (dManaSecurityApprove == 1)) {
Boolean test = false;
addErrorMessage(" oooooooooooo", null, true);
requestContext.addCallbackParam("isValid", test);
requestContext.addCallbackParam("isValid2", false);
return;
}
carentrypermitrequest.setSecuritymanagernotes(securityManagerNotes);
securityManager = new IoDepartmentsHome()
.findById(Integer.parseInt((configs.getProperty(ProcessConstant.DEP_Security_DEP))))
.getIoEmployeesByManagerid();
carentrypermitrequest.setSecuritymanager(securityManager);
IoEmployees actionEmployee = ioemployeeHome.findByUserId(getUserName());
carentrypermitrequest.setActionEmployee(actionEmployee);
if (dManaSecurityApprove.equals(1)) {
platenumber = getPlateString(plateNumerSplited);
carentrypermitrequest.setPlatenumber(platenumber);
CarType cartypeobj = cartypehome.findById(cartypevalue);
carentrypermitrequest.setCartypeId(cartypeobj);
CarCategory carcategoryobj = carcategoryehome.findById(carcategoryvalue);
carentrypermitrequest.setCarcategoryId(carcategoryobj);
CarColor carcolorobj = carcolorhome.findById(carcolorvalue);
carentrypermitrequest.setCarcolorId(carcolorobj);
carentrypermitrequest.setCarmodel(model);
carentrypermitrequest.setPermissioncase(permissioncase);
permissiondate = permissiondate.replace("/", "");
carentrypermitrequest.setPermissiondate(new Integer(permissiondate));
carentrypermitrequest.setPermissionenumber(new Integer(permissionenumber));
carentrypermitrequest.setVersionnumber(new Integer(versionnumber));
carentrypermitrequest.setLicenseVersion(licenseVersion);
carentrypermitrequest.setAccepted(1);
carentrypermitrequest.setAcceptDate(new Date());
carentrypermitrequest.setAcceptedBy(loggedInUserId);
carentrypermitrequest.setRequestStatus(CarEntryPermitRequestStatusEnum.ACCEPTED.getValue());
if (isexpireDate == true || permissioncase.equals(PERMIT_TYPE_TEMPORARY)) {
if (expireDate == null || expireDate.length() == 0) {
addErrorMessage("mmmmmmmmmmmm", null, true);
requestContext.addCallbackParam("isValid", Boolean.valueOf(false));
return;
}
String expireDatestr = expireDate.replace("/", "");
carentrypermitrequest.setExpiredate(new Integer(expireDatestr));
String hijriYear = expireDate.substring(0, 4);
String hijriMonth = expireDate.substring(5, 7);
String hijriDay = expireDate.substring(8);
String expireDateGreg = convertFromHijriToGreg(hijriYear, hijriMonth, hijriDay);
fields.put("expire", true);
fields.put("expireDate", expireDateGreg);
}
fields.put("decisionManaSecurityNum", 1);
fields.put("carentrypermitrequestID", carentrypermitrequestID);
processHandler.doComplete(fields);
sendSMSNotificaiton(empMobile, ProcessConstant.SMS_CODE_CAR_PASS, new String[] {});
}
if (dManaSecurityApprove.equals(2)) {
if (showSecurityManSec && StringUtils.isBlank(securityManagerNotes)) {
addErrorMessage("qqqqqqqqqq", null, true);
requestContext.addCallbackParam("isValid", Boolean.valueOf(false));
requestContext.addCallbackParam("isValid2", false);
return;
}
carentrypermitrequest.setRejectDate(new Date());
carentrypermitrequest.setRejectedBy(loggedInUserId);
carentrypermitrequest.setRejectReason(securityManagerNotes.trim());
carentrypermitrequest.setRequestStatus(CarEntryPermitRequestStatusEnum.REJECTED.getValue());
fields.put("refusedfrom", 1);
fields.put("decisionManaSecurityNum", 2);
fields.put("carentrypermitrequestID", carentrypermitrequestID);
processHandler.doComplete(fields);
String rejectReason = securityManagerNotes;
if (securityManagerNotes.length() > 20) {
rejectReason = securityManagerNotes.substring(0, 20) + "...";
}
String[] paramsArray = { carentrypermitrequest.getPlatenumber(), rejectReason };
sendSMSNotificaiton(empMobile, ProcessConstant.SMS_CODE_CAR_PASS_REJECTED, paramsArray);
}
if (dManaSecurityApprove.equals(3)) {
if (selectedEmp != null) {
fields.put("SecurityEmp", new String[] { selectedEmp });
}
fields.put("decisionManaSecurityNum", 3);
fields.put("carentrypermitrequestID", carentrypermitrequestID);
processHandler.doComplete(fields);
}
loadCredentials(
(HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest());
// sometimes this throws rollbackexception
carentrypermitrequesthome.merge(carentrypermitrequest);
// carentrypermitrequesthome.attachDirty(carentrypermitrequest);
this.transaction.commit();
}
} catch (Exception e) {
AppLogger.Log("######### EXCEPTION WITH CAR ENTRY REQUEST NUMBER: "
+ carentrypermitrequest.getCarentrypermitrequestId() + " WITH USER: " + loggedInUserId
+ ",stepNumber: " + stepNumber + ",permissionNumber: " + permissionenumber
+ ",getTranscationStatus: " + getTranscationStatus());
AppLogger.Log(e);
RequestContext.getCurrentInstance().addCallbackParam("isValid", Boolean.valueOf(false));
RequestContext.getCurrentInstance().addCallbackParam("error", true);
}
}
I want to know what is causing the RollbackException, since the thrown exception doesn't contain any details other than those posted above.
javax.transaction RollbackException exception is thrown when the transaction has been marked for rollback only or the transaction has been rolled back instead of committed. This is a local exception thrown by methods in the UserTransaction , Transaction , and TransactionManager interfaces.
You need to annotate your method with @Transactional(rollbackFor = Exception. class) and in catch block throw the exception(So that transactional proxy can detect the exception and Hence rollback) E.g. I tries annotating with @Transactional(rollbackFor = Exception. class) and using throw ex.
In the past I have been struggling with the same exact issue: I was trying to update an entity with some new data and kept receiving this RollBackException
without any trace.
After hours of debugging into the source code of Hibernate I had found out that another completely different exception was thrown previously from within the Hibernate's source code and swallowed inside an empty catch
block and disappearing from any external view. This broke the EntityManager
that i was using to merge my data.
In particular, Hibernate was trying to instance another entity required in the process but couldn't find the default public constructor.
How Hibernate's code could have lines of code containing empty catch
blocks is still unknown to me.
The version that i was using is 4.3.5.Final
.
I guess you are experiencing the same issue: some exception, maybe of different nature that the one that I faced (the lack of a public default constructor), is thrown from the hibernate layer, there-in catched and then not managed anyhow.
Download the source code of Hibernate and iterate there-in throughout the methods that are called by your procedure, especially keeping an eye open for empty catch blocks.
PLEASE NOTE that in my case the empty catch block did not belong to a method visible on the stack trace of the RollBackException
!
Here is a link to the post that i created at the time on CodeRanch to discuss my issue:
CodeRanch - RollbackException thrown when adding ManyToOne relationship
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With