Как найти причину javax.transaction.RollbackException?
Я использую спящий режим. Иногда, когда я пытаюсь обновить объект, используя следующий код:
this.transaction.begin();
// lots of lines of code here before the merge
merge(carentrypermitrequest);
this.transaction.commit(); // exception here
Я получаю следующее исключение:
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)
Вот как я получаю сессионную фабрику:
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");
}
}
Вот как я получаю транзакцию:
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");
}
}
Вот метод слияния:
public CarEntryPermitRequest merge(CarEntryPermitRequest detachedInstance) {
try {
CarEntryPermitRequest result = (CarEntryPermitRequest) sessionFactory.getCurrentSession()
.merge(detachedInstance);
return result;
} catch (RuntimeException re) {
throw re;
}
}
и метод completeAction()
:
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);
}
}
Я хочу знать, что вызывает исключение RollbackException, поскольку указанное исключение не содержит каких-либо сведений, кроме тех, которые были выше.
Пожалуйста, посоветуйте, спасибо.
Ответы
Ответ 1
Раньше я боролся с одной и той же точной проблемой: я пытался обновить сущность с некоторыми новыми данными и продолжал получать это RollBackException
без каких-либо следов.
После нескольких часов отладки в исходный код Hibernate я обнаружил, что еще одно совершенно другое исключение было выбрано ранее из исходного кода Hibernate и проглочено внутри пустого блока catch
и исчезает с любого внешнего вида. Это нарушило EntityManager
который я использовал для объединения моих данных.
В частности, Hibernate пытался экземпляр другого объекта, требуемого в этом процессе, но не смог найти публичный конструктор по умолчанию.
Как Hibernate код может иметь строки коды, содержащую пустые catch
блоки до сих пор мне неизвестно. Версия, которую я использовал, - 4.3.5.Final
.
Я предполагаю, что вы столкнулись с одной и той же проблемой: какое-то исключение, возможно, различного характера, которое тот, с которым я столкнулся (отсутствие публичного конструктора по умолчанию), выкидывается из слоя спящего режима, там, где-то, а затем не управляется.
Я предлагаю вам работать с одним и тем же процессом:
Загрузите исходный код Hibernate и выполните итерацию по всем методам, которые вызывают по вашей процедуре, особенно с открытым глазом для пустых блоков catch. ОБРАТИТЕ ВНИМАНИЕ, что в моем случае пустой блок catch не принадлежал методу, видимому на трассе стека RollBackException
!
Вот ссылка на сообщение, которое я создал в то время на CodeRanch, чтобы обсудить мою проблему:
CodeRanch - исключение RollbackException при добавлении отношения ManyToOne
Ответ 2
Я думаю, что вы должны инициализировать транзакцию каждый раз, но вы объявили транзакцию окончательной в этой строке:
public final UserTransaction transaction = getUserTransaction();
Поэтому измените свой код, чтобы создать новый объект транзакции в соответствии с вашим объектом подключения каждый раз, когда вам нужно начать транзакцию.