I just took a quick look (but not tested) at your code, and I don't see how not caching a proxy has any difference. Since the PlasticProxyFactory calls createObject() upon every method call.
I just tested a simple app with two PUs on the same page and it works fine. I still say this is not an issue. On Nov 13, 2012, at 8:55 PM, John wrote: > please see https://issues.apache.org/jira/browse/TAP5-2027 > ----- Original Message ----- > From: Lenny Primak > To: Tapestry development > Sent: Wednesday, November 14, 2012 1:21 AM > Subject: Re: PATCH: tapestry-jpa EntityManagerObjectProvider fixes entities > not associated with correct entity manager issue > > > I didn't look at this in detail, but proxies are sometimes thread-local, and > not really singletons. > Also, your patch isn't a real patch. it's a replacement, and harder to > incorporate for committers, > if it is indeed necessary. > > On Nov 13, 2012, at 8:09 PM, John wrote: > >> Hi, >> >> The original code is like below, note how the proxy provided acts like a >> singleton. I'll take a look at the JIRA, thanks. >> >> public class EntityManagerObjectProvider implements ObjectProvider >> { >> private EntityManager proxy; >> 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) >> { >> if (proxy == null) >> { >> ... >> } >> return proxy; >> ----- Original Message ----- >> From: Lenny Primak >> To: Tapestry development >> Cc: <dev@tapestry.apache.org> >> Sent: Wednesday, November 14, 2012 12:52 AM >> Subject: Re: PATCH: tapestry-jpa EntityManagerObjectProvider fixes entities >> not associated with correct entity manager issue >> >> >> I am not sure why the existing code doesn't work for you as it works fine in >> my environment. >> Another thing is that patches belong in JIRA and cannot be taken from >> mailing lists due to copyright issues. >> >> Perhaps Igor can shed some light on this? >> >> On Nov 13, 2012, at 7:48 PM, "John" <j...@quivinco.com> wrote: >> >>> I put this on the users group recently to complete a thread, it belongs >>> here really I suppose. >>> >>> The problem manifests when multiple PUs are defined in persistence.xml and >>> then referred to in classes using the @PersistenceContext(unitName= >>> annotation. As it is in 5.3.6 the first EntityManager wired up gets >>> injected to all successive EntityManager instances and the unitName= value >>> is ignored. Probem was caused by reusing a class variable. The bug makes it >>> seem that entities are not wired to the EntityManager as you would expect, >>> in fact the reference passed in is bad. >>> >>> Also refactored to use PlasticProxyFactory. >>> >>> John >>> >>> >>> ----- Original Message ----- From: John >>> To: Tapestry users >>> Sent: Tuesday, November 13, 2012 7:51 AM >>> Subject: PATCH: tapestry-jpa EntityManagerObjectProvider fixes entities not >>> associated with correct entity manager issue >>> >>> >>> This looks like a bug where a class member variable is used to cache the >>> EntityManager that is subsequently handed to all the PersistenceContext >>> annotations regardless of the unitName, like I said. >>> >>> The following replacement class is tested working and handles multiple >>> persistence units correctly as per the original Tapestry docs, just put it >>> on your classpath first. Maybe someone on the developer side can check this >>> out and commit it to the build cycle. >>> >>> >>> 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; >>> } >>> >>> } >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: dev-unsubscr...@tapestry.apache.org >>> For additional commands, e-mail: dev-h...@tapestry.apache.org >>> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: dev-unsubscr...@tapestry.apache.org >> For additional commands, e-mail: dev-h...@tapestry.apache.org > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@tapestry.apache.org > For additional commands, e-mail: dev-h...@tapestry.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tapestry.apache.org For additional commands, e-mail: dev-h...@tapestry.apache.org