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

Reply via email to