Scope of EntityManager
dapeng Dec 12, 2007 6:07 AMWhat is the default scope of a jpa entity manager in Seam? My experience is that it is CONVERSATION. Is that correct?
I often get an error message on the console that the transaction can not be started, when I access a page, which contains no component reference in the cnversation scope. The reason is somehow the component lookup for entityManager in default scope (CONVERSATION) fails, because no conversation has started yet. As soon as a conversation has been started in my application, the exception disappears.
java.lang.IllegalStateException: Could not start transaction at org.jboss.seam.jsf.SeamPhaseListener.begin(SeamPhaseListener.java:571 ) at org.jboss.seam.jsf.SeamPhaseListener.handleTransactionsBeforePhase(Se amPhaseListener.java:307) at org.jboss.seam.jsf.SeamPhaseListener.beforeServletPhase(SeamPhaseList ener.java:142) at org.jboss.seam.jsf.SeamPhaseListener.beforePhase(SeamPhaseListener.ja va:116) at org.ajax4jsf.resource.ResourceLifecycle.invokePhaseListener(ResourceL ifecycle.java:201) at org.ajax4jsf.resource.ResourceLifecycle.processPhaseListeners(Resourc eLifecycle.java:177) at org.ajax4jsf.resource.ResourceLifecycle.send(ResourceLifecycle.java:1 47) at org.ajax4jsf.resource.InternetResourceService.load(InternetResourceSe rvice.java:336) at org.ajax4jsf.cache.LRUMapCache.load(LRUMapCache.java:116) at org.ajax4jsf.cache.LRUMapCache.get(LRUMapCache.java:87) at org.ajax4jsf.resource.InternetResourceService.serviceResource(Interne tResourceService.java:198) at org.ajax4jsf.resource.InternetResourceService.serviceResource(Interne tResourceService.java:144) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:265) at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:60) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter .java:69) at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:58) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter .java:69) at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl icationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF ilterChain.java:206) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFi lter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl icationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF ilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV alve.java:230) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV alve.java:175) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(Securit yAssociationValve.java:179) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValv e.java:84) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j ava:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j ava:102) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedC onnectionValve.java:157) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal ve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav a:262) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java :844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce ss(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:44 6) at java.lang.Thread.run(Thread.java:595) Caused by: org.springframework.transaction.CannotCreateTransactionException: Cou ld not open JPA EntityManager for transaction; nested exception is java.lang.Ill egalArgumentException: Instance must not be null at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransact ionManager.java:374) at org.springframework.transaction.support.AbstractPlatformTransactionMa nager.getTransaction(AbstractPlatformTransactionManager.java:350) at org.jboss.seam.ioc.spring.SpringTransaction.begin(SpringTransaction.j ava:74) at org.jboss.seam.jsf.SeamPhaseListener.begin(SeamPhaseListener.java:566 ) ... 35 more Caused by: java.lang.IllegalArgumentException: Instance must not be null at org.springframework.util.Assert.notNull(Assert.java:112) at org.springframework.util.ClassUtils.getAllInterfaces(ClassUtils.java: 703) at org.jboss.seam.ioc.spring.SeamManagedEntityManagerFactory.createEntit yManager(SeamManagedEntityManagerFactory.java:61) at org.springframework.orm.jpa.JpaTransactionManager.createEntityManager ForTransaction(JpaTransactionManager.java:391) at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransact ionManager.java:315) ... 38 more 12:02:31,191 ERROR [SeamPhaseListener] swallowing exception java.lang.IllegalStateException: Could not start transaction at org.jboss.seam.jsf.SeamPhaseListener.begin(SeamPhaseListener.java:571 ) at org.jboss.seam.jsf.SeamPhaseListener.handleTransactionsBeforePhase(Se amPhaseListener.java:307) at org.jboss.seam.jsf.SeamPhaseListener.beforeServletPhase(SeamPhaseList ener.java:142) at org.jboss.seam.jsf.SeamPhaseListener.beforePhase(SeamPhaseListener.ja va:116) at org.ajax4jsf.resource.ResourceLifecycle.invokePhaseListener(ResourceL ifecycle.java:201) at org.ajax4jsf.resource.ResourceLifecycle.processPhaseListeners(Resourc eLifecycle.java:177) at org.ajax4jsf.resource.ResourceLifecycle.send(ResourceLifecycle.java:1 47) at org.ajax4jsf.resource.InternetResourceService.load(InternetResourceSe rvice.java:336) at org.ajax4jsf.cache.LRUMapCache.load(LRUMapCache.java:116) at org.ajax4jsf.cache.LRUMapCache.get(LRUMapCache.java:87) at org.ajax4jsf.resource.InternetResourceService.serviceResource(Interne tResourceService.java:198) at org.ajax4jsf.resource.InternetResourceService.serviceResource(Interne tResourceService.java:144) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:265) at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:60) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter .java:69) at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:58) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter .java:69) at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl icationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF ilterChain.java:206) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFi lter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl icationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF ilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV alve.java:230) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV alve.java:175) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(Securit yAssociationValve.java:179) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValv e.java:84) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j ava:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j ava:102) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedC onnectionValve.java:157) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal ve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav a:262) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java :844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce ss(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:44 6) at java.lang.Thread.run(Thread.java:595) Caused by: org.springframework.transaction.CannotCreateTransactionException: Cou ld not open JPA EntityManager for transaction; nested exception is java.lang.Ill egalArgumentException: Instance must not be null at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransact ionManager.java:374) at org.springframework.transaction.support.AbstractPlatformTransactionMa nager.getTransaction(AbstractPlatformTransactionManager.java:350) at org.jboss.seam.ioc.spring.SpringTransaction.begin(SpringTransaction.j ava:74) at org.jboss.seam.jsf.SeamPhaseListener.begin(SeamPhaseListener.java:566 ) ... 35 more Caused by: java.lang.IllegalArgumentException: Instance must not be null at org.springframework.util.Assert.notNull(Assert.java:112) at org.springframework.util.ClassUtils.getAllInterfaces(ClassUtils.java: 703) at org.jboss.seam.ioc.spring.SeamManagedEntityManagerFactory.createEntit yManager(SeamManagedEntityManagerFactory.java:61) at org.springframework.orm.jpa.JpaTransactionManager.createEntityManager ForTransaction(JpaTransactionManager.java:391) at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransact ionManager.java:315) ... 38 more
I am using Seam together with Spring. application-context.xml
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <!-- <property name="dataSource" ref="dataSource"/> --> <property name="persistenceUnitName" value="asap"/> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <!-- Be sure to specify the SeamManagedEntityManagerFactory since that will manage the EM that will be beginning and ending transactions.--> <property name="entityManagerFactory" ref="seamEntityManagerFactory" /> </bean> <tx:annotation-driven proxy-target-class="true" /> <seam:configure-scopes /> <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"> <!-- Because we have multiple EntityManagerFactories in this applicaitonContext identify the SeamManagedEntityManagerFactory as the default --> <property name="defaultPersistenceUnitName" value="persistenceContextName" /> </bean> <!-- EMF that wraps a Seam Managed EM instance for use in Spring --> <bean id="seamEntityManagerFactory" class="org.jboss.seam.ioc.spring.SeamManagedEntityManagerFactoryBean"> <!-- The Seam managed-persistence-context component name. --> <property name="persistenceContextName" value="entityManager" /> <!-- Optionally provide a unit name. If not specified the default would be the persistenceContextName --> <property name="persistenceUnitName" value="persistenceContextName" /> </bean>
components.xml
<core:init debug="true" /> <core:manager conversation-timeout="120000" concurrent-request-timeout="500" conversation-id-parameter="cid" /> <persistence:managed-persistence-context name="entityManager" auto-create="true" entity-manager-factory="#{entityManagerFactory}" /> <spring:context-loader> <spring:config-locations> <value>classpath:/META-INF/web-context.xml</value> <value>classpath:/META-INF/core-custom-context.xml</value> <value>classpath:/META-INF/application-context.xml</value> </spring:config-locations> </spring:context-loader> <spring:spring-transaction platform-transaction-manager="#{transactionManager}" />