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

Reply via email to