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
[email protected]
*** 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