Patch with tests is even better. On Nov 14, 2012, at 8:12 AM, Lenny Primak wrote:
> That's still not a patch. Patches look like this: > > http://guide.macports.org/chunked/development.patches.html > > If you attach that to the JIRA you have a better chance of someone looking at > it. > > On Nov 13, 2012, at 8:37 PM, John wrote: > >> I got the original source code from tapestry-jpa version 5.3.6 which I see >> is not registered in the JIRA, so I can't report this bug. Perhaps this is >> only in this version, I will try another. >> >> It is more like a refactor as provided. >> >> As a patch >> remove the private EntityManager proxy line >> remove if (proxy == null) {}conditionality code block wrapping >> >> This also works and was my original code change until I saw depricated >> classes being used. >> >> John >> >> >> ----- 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 > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tapestry.apache.org For additional commands, e-mail: dev-h...@tapestry.apache.org