Hi, JPA makes me mad these days ;-) I have a simple DAO which might produce invalid JPAQL.
@Repository @Transactional public class MetaDataDaoImpl implements MetaDataDao { public Object getClientMetaDataByObjName(String objname, long client) { Query query = em.createQuery("select x from " + objname + " x where x.client = " + client); Object o; try { o = query.getSingleResult(); } catch (Exception e) { return null; } return o; } } There are cases where "objname" is an invalid identifier and i cant prevent this. So i thought i just return null in this case. Of course i am getting the expected org.apache.openjpa.persistence.ArgumentException in the try block. So i get into the catch block and the CALLER should proceed, but in fact, when leaving this method, the CALLER never gets the chance to proceed because of the exception below. First of all i dont know why he want to commit() something in a method where i dont modify any object. In fact i dont even get an object back which i could change. I also tried "read only" with a seperate Transaction attribute on the method and i also tried a REQUIRES_NEW, just to be sure that i am not wihin a larger transaction block, which i am not. When i move the try catch block to the caller and throwing the exeption from the DAO, i can proceed and ignore the stuff in the caller. But why doesnt it work the way i ve done it? --- javax.servlet.ServletException: org.springframework.orm.jpa.JpaSystemException: The transaction cannot be committed, because it was already marked for rollback only. The transaction will be rolled back instead. The cause of the rollback-only status is reported in the embedded stack.; nested exception is org.apache.openjpa.persistence.PersistenceException: The transaction cannot be committed, because it was already marked for rollback only. The transaction will be rolled back instead. The cause of the rollback-only status is reported in the embedded stack. at org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:520) at com.cc.framework.adapter.struts.FWRequestProcessor.processActionPerform(Unknown Source) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462) at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at de.netversys.util.filter.CheckSessionFilter.doFilter(CheckSessionFilter.java:50) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118) at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:619) Caused by: org.springframework.orm.jpa.JpaSystemException: The transaction cannot be committed, because it was already marked for rollback only. The transaction will be rolled back instead. The cause of the rollback-only status is reported in the embedded stack.; nested exception is org.apache.openjpa.persistence.PersistenceException: The transaction cannot be committed, because it was already marked for rollback only. The transaction will be rolled back instead. The cause of the rollback-only status is reported in the embedded stack. at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:296) at org.springframework.orm.jpa.DefaultJpaDialect.translateExceptionIfPossible(DefaultJpaDialect.java:120) at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:460) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:709) at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:678) at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) at $Proxy12.getClientMetaDataByObjName(Unknown Source) at de.netversys.process.AbstractProductEvaluator.getBasicClientMetaData(AbstractProductEvaluator.java:108) at de.netversys.process.PossibleProductsEvaluator.getPossibleProducts(PossibleProductsEvaluator.java:119) at de.netversys.action.frontend.DoWeightingAction.doExecute(DoWeightingAction.java:183) at de.netversys.action.frontend.FrontendAction.execute(FrontendAction.java:63) at de.logentis.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:105) at com.cc.framework.adapter.struts.RequestProcessorUtil.processAction(Unknown Source) ... 25 more Caused by: org.apache.openjpa.persistence.PersistenceException: The transaction cannot be committed, because it was already marked for rollback only. The transaction will be rolled back instead. The cause of the rollback-only status is reported in the embedded stack. at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:89) at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1350) at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:877) at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:512) at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:456) ... 38 more Caused by: org.apache.openjpa.persistence.ArgumentException: An error occurred while parsing the query filter "select x from MdExekutiveTransport x where x.client = 50". Error message: The name "MdExekutiveTransport" is not a recognized entity or identifier. Perhaps you meant MdSeurDefault, which is a close match. Known entity names: [User, CarrierMapping,] at org.apache.openjpa.kernel.exps.AbstractExpressionBuilder.parseException(AbstractExpressionBuilder.java:118) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getClassMetaData(JPQLExpressionBuilder.java:177) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.resolveClassMetaData(JPQLExpressionBuilder.java:150) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JPQLExpressionBuilder.java:225) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JPQLExpressionBuilder.java:195) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateType(JPQLExpressionBuilder.java:188) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.access$600(JPQLExpressionBuilder.java:69) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.populate(JPQLExpressionBuilder.java:1756) at org.apache.openjpa.kernel.jpql.JPQLParser.populate(JPQLParser.java:56) at org.apache.openjpa.kernel.ExpressionStoreQuery.populateFromCompilation(ExpressionStoreQuery.java:153) at org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:658) at org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:639) at org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:605) at org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:667) at org.apache.openjpa.kernel.QueryImpl.getOperation(QueryImpl.java:1492) at org.apache.openjpa.kernel.DelegatingQuery.getOperation(DelegatingQuery.java:123) at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:243) at org.apache.openjpa.persistence.QueryImpl.getSingleResult(QueryImpl.java:316) at de.netversys.dao.impl.MetaDataDaoImpl.getClientMetaDataByObjName(MetaDataDaoImpl.java:74) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) ... 34 more -- Marc Logemann - LOGENTIS GmbH geschäftsführender Gesellschafter Westerbreite 7 - 49084 Osnabrück Tel. +49 (0)541 - 80049791 Fax +49 (0)541 - 9778172 Mob. +49 (0)177 - 8220182 http://www.logentis.de m...@logentis.de *** Enterprise Versandlogistik: http://www.netversys.de Sitz der Gesellschaft: Osnabrück | Geschäftsführer: Marc Logemann | Handelsregisternummer: Amtsgericht Osnabrück, HRB 201057 | UstIdNr: DE 814858920