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

Reply via email to