Interresting, We've had the same 'problems' and i solved it with a 'mapped' caching EntityProvider, like this:
package nl.intercommit.godocument.services.internal.core; import java.util.HashMap; import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.apache.tapestry5.internal.jpa.JpaInternalUtils; import org.apache.tapestry5.ioc.AnnotationProvider; import org.apache.tapestry5.ioc.ObjectCreator; import org.apache.tapestry5.ioc.ObjectLocator; import org.apache.tapestry5.ioc.ObjectProvider; import org.apache.tapestry5.ioc.annotations.PostInjection; import org.apache.tapestry5.ioc.services.PlasticProxyFactory; import org.apache.tapestry5.jpa.EntityManagerManager; /* * ObjectProvider for EntityManager that takes the unitname as key for proxy caching. * */ public class MappedEntityManagerObjectProvider implements ObjectProvider { // these are alive for the lifetime of the application private Map<String,EntityManager> proxies; @PostInjection public void setup() { proxies = new HashMap<String, EntityManager>(3); } /** * {@inheritDoc} */ public <T> T provide(final Class<T> objectType, final AnnotationProvider annotationProvider, final ObjectLocator locator) { if (objectType.equals(EntityManager.class)) return objectType.cast(getOrCreateProxy(annotationProvider, locator)); return null; } private synchronized EntityManager getOrCreateProxy( final AnnotationProvider annotationProvider, final ObjectLocator objectLocator) { final PersistenceContext annotation = annotationProvider.getAnnotation(PersistenceContext.class); String name = null; if (annotation != null) { name = annotation.unitName(); } if (!proxies.containsKey(name)) { final PlasticProxyFactory classFactory = objectLocator.getService("PlasticProxyFactory",PlasticProxyFactory.class); final EntityManager proxy = classFactory.createProxy(EntityManager.class, new ObjectCreator<EntityManager>() { public EntityManager createObject() { final EntityManagerManager entityManagerManager = objectLocator.getService(EntityManagerManager.class); return JpaInternalUtils.getEntityManager(entityManagerManager, annotation); } }, "<EntityManagerProxy>"); if (name != null) { proxies.put(name, proxy); } return proxy; } return proxies.get(name); } } And then in the application module: @Contribute(MasterObjectProvider.class) public static void provideObjectProviders(final OrderedConfiguration<ObjectProvider> configuration) { // Override the entitymanager object provider ! configuration.overrideInstance("EntityManager", MappedEntityManagerObjectProvider.class,"before:AnnotationBasedContributions"); } ---- OriginalMessage ---- >From: "John" <j...@quivinco.com> >To: "Tapestry users" <users@tapestry.apache.org> >Sent: Thu, Oct 30, 2014, 08:27 >Subject: Re: persistence units > >Hi, > >To get Tapestry 5.3.7 working with more than 1 PU, 2 SQL Servers and 1 >PostgreSQL Db in my case, I supplied this modified class in my project JAR. >I'm not sure this works on 5.4 or is required? Without this change I think >you just get the first defined PU whatever you define with >PersistenceContext. > >This code has been used on a live system for years now, it's solid. Suggest >you try it and report back. > >John > >/** >* EntityManagerObjectProvider.java >*/ >package org.apache.tapestry5.internal.jpa; > >import javax.persistence.EntityManager; >import javax.persistence.PersistenceContext; > >import org.apache.tapestry5.ioc.AnnotationProvider; >import org.apache.tapestry5.ioc.ObjectCreator; >import org.apache.tapestry5.ioc.ObjectLocator; >import org.apache.tapestry5.ioc.ObjectProvider; >import org.apache.tapestry5.ioc.services.PlasticProxyFactory; >import org.apache.tapestry5.jpa.EntityManagerManager; > >/** >* A patched version to use PlasticProxyFactory and not cache the >EntityManager >* as a class member. >* >* @author John Coleman >*/ >public class EntityManagerObjectProvider implements ObjectProvider { > > /** > * {@inheritDoc} > */ > public <T> T provide(final Class<T> objectType, > final AnnotationProvider annotationProvider, > final ObjectLocator locator) { > if (objectType.equals(EntityManager.class)) > return objectType > .cast(getOrCreateProxy(annotationProvider, locator)); > > return null; > } > > private synchronized EntityManager getOrCreateProxy( > final AnnotationProvider annotationProvider, > final ObjectLocator objectLocator) { > final PlasticProxyFactory proxyFactory = objectLocator.getService( > "PlasticProxyFactory", PlasticProxyFactory.class); > > final PersistenceContext annotation = annotationProvider > .getAnnotation(PersistenceContext.class); > > EntityManager proxy = proxyFactory.createProxy(EntityManager.class, > new ObjectCreator<EntityManager>() { > public EntityManager createObject() { > final EntityManagerManager entityManagerManager = objectLocator > .getService(EntityManagerManager.class); > > return JpaInternalUtils.getEntityManager( > entityManagerManager, annotation); > } > }, "<EntityManagerProxy>"); > > return proxy; > } >} > > > >-----Original Message----- >From: Andreas Ernst >Sent: Wednesday, October 29, 2014 8:08 PM >To: Tapestry users >Subject: persistence units > >Hi, > >if i use two persistence units, i got this error: > >Information: [EL Info]: 2014-10-29 >21:05:35.83--ServerSession(1380726004)--EclipseLink, version: Eclipse >Persistence Services - 2.5.2.v20140319-9ad6abd >Information: [EL Severe]: ejb: 2014-10-29 >21:05:35.831--ServerSession(1380726004)--java.lang.IllegalStateException: >This >web container has not yet been started >Information: [ERROR] ioc.Registry >javax.persistence.PersistenceException: java.lang.IllegalStateException: >This web container has not yet been started >Information: [ERROR] ioc.Registry Operations trace: >Information: [ERROR] ioc.Registry [ 1] Invoking startup method >org.apache.tapestry5.jpa.modules.JpaModule.startupEarly(EntityManagerManager, >boolean). >Schwerwiegend: WebModule[/AEOnlineExtranet]Exception starting filter app >java.lang.InstantiationException >at >org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:135) >at >org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:5329) >at >org.apache.catalina.core.StandardContext.start(StandardContext.java:5943) >at com.sun.enterprise.web.WebModule.start(WebModule.java:691) >at >org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1041) >at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:1024) >at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:747) >at >com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:2286) >at >com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1932) >at com.sun.enterprise.web.WebApplication.start(WebApplication.java:139) >at org.glassfish.internal.data.EngineRef.start(EngineRef.java:122) >at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:291) >at >org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:352) >at >com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:500) >at >com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219) >at >org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:539) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:535) >at java.security.AccessController.doPrivileged(Native Method) >at javax.security.auth.Subject.doAs(Subject.java:360) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:534) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:565) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:557) >at java.security.AccessController.doPrivileged(Native Method) >at javax.security.auth.Subject.doAs(Subject.java:360) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:556) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1464) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1300(CommandRunnerImpl.java:109) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1846) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1722) >at >org.glassfish.deployment.admin.ReDeployCommand.execute(ReDeployCommand.java:131) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:539) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:535) >at java.security.AccessController.doPrivileged(Native Method) >at javax.security.auth.Subject.doAs(Subject.java:360) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:534) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:565) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:557) >at java.security.AccessController.doPrivileged(Native Method) >at javax.security.auth.Subject.doAs(Subject.java:360) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:556) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1464) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1300(CommandRunnerImpl.java:109) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1846) >at >com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1722) >at >com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534) >at >com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:224) >at >org.glassfish.grizzly.http.server.StaticHttpHandlerBase.service(StaticHttpHandlerBase.java:189) >at >com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) >at >com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) >at >org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201) >at >org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175) >at >org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) >at >org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) >at >org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284) >at >org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201) >at >org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133) >at >org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112) >at >org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) >at >org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561) >at >org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) >at >org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) >at >org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) >at >org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) >at >org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565) >at >org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545) >at java.lang.Thread.run(Thread.java:745) > > >It is possible to use two persistence units? > >TIA >Andreas >-- >ae | Andreas Ernst | IT Spektrum >Postfach 5, 65612 Beselich >Schupbacher Str. 32, 65614 Beselich, Germany >Tel: +49-6484-91002 Fax: +49-6484-91003 >a...@ae-online.de | www.ae-online.de >www.tachyon-online.de > >--------------------------------------------------------------------- >To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org >For additional commands, e-mail: users-h...@tapestry.apache.org > > >--- >This email is free from viruses and malware because avast! Antivirus >protection is active. >http://www.avast.com > > >--------------------------------------------------------------------- >To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org >For additional commands, e-mail: users-h...@tapestry.apache.org > > > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org