You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by jo...@apache.org on 2017/06/25 01:04:16 UTC

deltaspike git commit: DELTASPIKE-940 - First step in merging support for qualifiers and entity manager resolvers in data and JPA modules.

Repository: deltaspike
Updated Branches:
  refs/heads/master 764545c2d -> 256431539


DELTASPIKE-940 - First step in merging support for qualifiers and entity manager resolvers in data and JPA modules.


Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/25643153
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/25643153
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/25643153

Branch: refs/heads/master
Commit: 256431539ca8b01aa237d33f5bcb723e292f8893
Parents: 764545c
Author: John D. Ament <jo...@apache.org>
Authored: Sat Jun 24 21:03:10 2017 -0400
Committer: John D. Ament <jo...@apache.org>
Committed: Sat Jun 24 21:03:10 2017 -0400

----------------------------------------------------------------------
 deltaspike/modules/data/api/pom.xml             |   5 +
 .../data/api/EntityManagerConfig.java           |   4 +-
 .../data/api/EntityManagerResolver.java         |  10 +-
 .../data/impl/handler/EntityManagerRef.java     |  98 -------------
 .../impl/handler/EntityManagerRefLookup.java    | 136 -------------------
 .../data/impl/handler/QueryHandler.java         |   2 +
 .../data/impl/meta/RepositoryMetadata.java      |  39 +-----
 .../meta/RepositoryMetadataInitializer.java     |  29 ++--
 .../data/impl/handler/EntityManagerTest.java    |  21 ++-
 .../service/BasicEntityManagerResolver.java     |  38 ++++++
 ...gacyRepositoryWithEntityManagerResolver.java |  36 +++++
 ...mpleRepositoryWithEntityManagerResolver.java |   2 +-
 .../SimplisticEntityManagerResolver.java        |   4 +-
 .../api/entitymanager/EntityManagerConfig.java  |  58 ++++++++
 .../entitymanager/EntityManagerResolver.java    |  36 +++++
 .../jpa/api/transaction/Transactional.java      |   5 +
 .../entitymanager/EntityManagerMetadata.java    | 114 ++++++++++++++++
 .../impl/entitymanager/EntityManagerRef.java    |  99 ++++++++++++++
 .../entitymanager/EntityManagerRefLookup.java   | 136 +++++++++++++++++++
 19 files changed, 572 insertions(+), 300 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/data/api/pom.xml
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/api/pom.xml b/deltaspike/modules/data/api/pom.xml
index 31e2fa1..9b4e920 100755
--- a/deltaspike/modules/data/api/pom.xml
+++ b/deltaspike/modules/data/api/pom.xml
@@ -59,6 +59,11 @@
             <artifactId>deltaspike-partial-bean-module-api</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.deltaspike.modules</groupId>
+            <artifactId>deltaspike-jpa-module-api</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/EntityManagerConfig.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/EntityManagerConfig.java b/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/EntityManagerConfig.java
index e0bfb96..8a1a5f4 100644
--- a/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/EntityManagerConfig.java
+++ b/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/EntityManagerConfig.java
@@ -18,6 +18,7 @@
  */
 package org.apache.deltaspike.data.api;
 
+import javax.persistence.FlushModeType;
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Inherited;
@@ -25,8 +26,6 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
-import javax.persistence.FlushModeType;
-
 /**
  * Configure the EntityManager for a specific repository.
  */
@@ -34,6 +33,7 @@ import javax.persistence.FlushModeType;
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 @Inherited
+@Deprecated
 public @interface EntityManagerConfig
 {
     /**

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/EntityManagerResolver.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/EntityManagerResolver.java b/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/EntityManagerResolver.java
index de10da3..388d1d8 100644
--- a/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/EntityManagerResolver.java
+++ b/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/EntityManagerResolver.java
@@ -18,15 +18,13 @@
  */
 package org.apache.deltaspike.data.api;
 
-import javax.persistence.EntityManager;
-
 /**
  * Resolve the EntityManager used for a specific repository.
  * Only necessary if there is more than one persistence unit.
+ *
+ * This interface is deprecated and instead you should use the version from JPA module
  */
-public interface EntityManagerResolver
+@Deprecated
+public interface EntityManagerResolver extends org.apache.deltaspike.jpa.api.entitymanager.EntityManagerResolver
 {
-
-    EntityManager resolveEntityManager();
-
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRef.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRef.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRef.java
deleted file mode 100644
index 5039003..0000000
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRef.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.deltaspike.data.impl.handler;
-
-import javax.persistence.EntityManager;
-import org.apache.deltaspike.core.api.provider.DependentProvider;
-import org.apache.deltaspike.data.api.EntityManagerResolver;
-
-public class EntityManagerRef
-{
-    private EntityManager entityManager;
-    private DependentProvider<? extends EntityManager> entityManagerDependentProvider;
-    
-    private Class<? extends EntityManagerResolver> entityManagerResolverClass;
-    private EntityManagerResolver entityManagerResolver;
-    private DependentProvider<? extends EntityManagerResolver> entityManagerResolverDependentProvider;
-        
-    public void release()
-    {
-        if (entityManagerDependentProvider != null)
-        {
-            entityManagerDependentProvider.destroy();
-        }
-        
-        if (entityManagerResolverDependentProvider != null)
-        {
-            entityManagerResolverDependentProvider.destroy();
-        }
-    }
-
-    public Class<? extends EntityManagerResolver> getEntityManagerResolverClass()
-    {
-        return entityManagerResolverClass;
-    }
-
-    public void setEntityManagerResolverClass(Class<? extends EntityManagerResolver> entityManagerResolverClass)
-    {
-        this.entityManagerResolverClass = entityManagerResolverClass;
-    }
-
-    public DependentProvider<? extends EntityManagerResolver> getEntityManagerResolverDependentProvider()
-    {
-        return entityManagerResolverDependentProvider;
-    }
-
-    public void setEntityManagerResolverDependentProvider(
-            DependentProvider<? extends EntityManagerResolver> entityManagerResolverDependentProvider)
-    {
-        this.entityManagerResolverDependentProvider = entityManagerResolverDependentProvider;
-    }
-
-    public EntityManager getEntityManager()
-    {
-        return entityManager;
-    }
-
-    public void setEntityManager(EntityManager entityManager)
-    {
-        this.entityManager = entityManager;
-    }
-
-    public EntityManagerResolver getEntityManagerResolver()
-    {
-        return entityManagerResolver;
-    }
-
-    public void setEntityManagerResolver(EntityManagerResolver entityManagerResolver)
-    {
-        this.entityManagerResolver = entityManagerResolver;
-    }
-
-    public DependentProvider<? extends EntityManager> getEntityManagerDependentProvider()
-    {
-        return entityManagerDependentProvider;
-    }
-
-    public void setEntityManagerDependentProvider(
-            DependentProvider<? extends EntityManager> entityManagerDependentProvider)
-    {
-        this.entityManagerDependentProvider = entityManagerDependentProvider;
-    }
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRefLookup.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRefLookup.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRefLookup.java
deleted file mode 100644
index 3bec649..0000000
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRefLookup.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.deltaspike.data.impl.handler;
-
-import java.util.Set;
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.BeanManager;
-import javax.inject.Inject;
-import javax.persistence.EntityManager;
-import org.apache.deltaspike.core.api.provider.BeanManagerProvider;
-
-import org.apache.deltaspike.core.api.provider.BeanProvider;
-import org.apache.deltaspike.data.impl.meta.RepositoryMetadata;
-import org.apache.deltaspike.jpa.spi.entitymanager.ActiveEntityManagerHolder;
-
-@ApplicationScoped
-public class EntityManagerRefLookup
-{
-    @Inject
-    private ActiveEntityManagerHolder activeEntityManagerHolder;
-
-    private volatile Boolean globalEntityManagerInitialized;
-    private boolean globalEntityManagerIsNormalScope;
-    private EntityManager globalEntityManager;
-    
-    private void lazyInitGlobalEntityManager()
-    {
-        if (this.globalEntityManagerInitialized == null)
-        {
-            initGlobalEntityManager();
-        }
-    }
-
-    private synchronized void initGlobalEntityManager()
-    {
-        // switch into paranoia mode
-        if (this.globalEntityManagerInitialized == null)
-        {
-            this.globalEntityManagerInitialized = true;
-            
-            BeanManager beanManager = BeanManagerProvider.getInstance().getBeanManager();
-            Set<Bean<?>> beans = beanManager.getBeans(EntityManager.class);
-            Bean<?> bean = beanManager.resolve(beans);
-
-            if (bean == null)
-            {
-                throw new IllegalStateException("Could not find EntityManager with default qualifier.");
-            }
-            
-            globalEntityManagerIsNormalScope = beanManager.isNormalScope(bean.getScope());
-            if (globalEntityManagerIsNormalScope)
-            {
-                globalEntityManager = (EntityManager) beanManager.getReference(bean,
-                        EntityManager.class,
-                        beanManager.createCreationalContext(bean));       
-            }
-        }
-    }
-    
-    public EntityManagerRef lookupReference(final RepositoryMetadata repositoryMetadata)
-    {
-        EntityManagerRef ref = new EntityManagerRef();
-
-        if (repositoryMetadata.getEntityManagerResolverClass() != null)
-        {
-            ref.setEntityManagerResolverClass(repositoryMetadata.getEntityManagerResolverClass());
-            
-            if (repositoryMetadata.isEntityManagerResolverIsNormalScope())
-            {
-                ref.setEntityManagerResolver(
-                        BeanProvider.getContextualReference(ref.getEntityManagerResolverClass()));
-            }
-            else
-            {
-                ref.setEntityManagerResolverDependentProvider(
-                        BeanProvider.getDependent(ref.getEntityManagerResolverClass()));
-
-                ref.setEntityManagerResolver(
-                        ref.getEntityManagerResolverDependentProvider().get());
-            }
-            
-            ref.setEntityManager(
-                    ref.getEntityManagerResolver().resolveEntityManager());
-        }
-        else
-        {
-            if (activeEntityManagerHolder.isSet())
-            {
-                ref.setEntityManager(
-                        activeEntityManagerHolder.get());
-                
-                // TODO should we really not apply the FlushMode on the active EntityManager?
-                return ref;
-            }
-            else
-            {
-                lazyInitGlobalEntityManager();
-                if (globalEntityManagerIsNormalScope)
-                {
-                    ref.setEntityManager(globalEntityManager);
-                }
-                else
-                {
-                    ref.setEntityManagerDependentProvider(
-                            BeanProvider.getDependent(EntityManager.class));
-                    ref.setEntityManager(
-                            ref.getEntityManagerDependentProvider().get());
-                }
-            }
-        }
-
-        if (repositoryMetadata.getEntityManagerFlushMode() != null)
-        {
-            ref.getEntityManager().setFlushMode(repositoryMetadata.getEntityManagerFlushMode());
-        }
-
-        return ref;
-    }
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/QueryHandler.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/QueryHandler.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/QueryHandler.java
index 9767e1d..e17ec2e 100755
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/QueryHandler.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/QueryHandler.java
@@ -29,6 +29,8 @@ import org.apache.deltaspike.data.impl.builder.QueryBuilder;
 import org.apache.deltaspike.data.impl.builder.QueryBuilderFactory;
 import org.apache.deltaspike.data.impl.meta.RepositoryMetadataHandler;
 import org.apache.deltaspike.jpa.api.transaction.Transactional;
+import org.apache.deltaspike.jpa.impl.entitymanager.EntityManagerRef;
+import org.apache.deltaspike.jpa.impl.entitymanager.EntityManagerRefLookup;
 import org.apache.deltaspike.jpa.spi.entitymanager.ActiveEntityManagerHolder;
 import org.apache.deltaspike.jpa.spi.transaction.TransactionStrategy;
 

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryMetadata.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryMetadata.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryMetadata.java
index e690128..4610e7a 100644
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryMetadata.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryMetadata.java
@@ -20,20 +20,15 @@ package org.apache.deltaspike.data.impl.meta;
 
 import java.lang.reflect.Method;
 import java.util.Map;
-import javax.persistence.FlushModeType;
-import org.apache.deltaspike.data.api.EntityManagerResolver;
+import org.apache.deltaspike.jpa.impl.entitymanager.EntityManagerMetadata;
 
-public class RepositoryMetadata
+public class RepositoryMetadata extends EntityManagerMetadata
 {
     private Class<?> repositoryClass;
 
     private EntityMetadata entityMetadata;
     private Map<Method, RepositoryMethodMetadata> methodsMetadata;
 
-    private Class<? extends EntityManagerResolver> entityManagerResolverClass;
-    private boolean entityManagerResolverIsNormalScope;
-    private FlushModeType entityManagerFlushMode;
-    
     public RepositoryMetadata(Class<?> repositoryClass)
     {
         this.repositoryClass = repositoryClass;
@@ -65,36 +60,6 @@ public class RepositoryMetadata
         this.entityMetadata = entityMetadata;
     }
 
-    public Class<? extends EntityManagerResolver> getEntityManagerResolverClass()
-    {
-        return entityManagerResolverClass;
-    }
-
-    public void setEntityManagerResolverClass(Class<? extends EntityManagerResolver> entityManagerResolverClass)
-    {
-        this.entityManagerResolverClass = entityManagerResolverClass;
-    }
-
-    public FlushModeType getEntityManagerFlushMode()
-    {
-        return entityManagerFlushMode;
-    }
-
-    public void setEntityManagerFlushMode(FlushModeType entityManagerFlushMode)
-    {
-        this.entityManagerFlushMode = entityManagerFlushMode;
-    }
-
-    public boolean isEntityManagerResolverIsNormalScope()
-    {
-        return entityManagerResolverIsNormalScope;
-    }
-
-    public void setEntityManagerResolverIsNormalScope(boolean entityManagerResolverIsNormalScope)
-    {
-        this.entityManagerResolverIsNormalScope = entityManagerResolverIsNormalScope;
-    }
-
     public Map<Method, RepositoryMethodMetadata> getMethodsMetadata()
     {
         return methodsMetadata;

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryMetadataInitializer.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryMetadataInitializer.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryMetadataInitializer.java
index 2ddcc6d..6ecda3e 100644
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryMetadataInitializer.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryMetadataInitializer.java
@@ -49,24 +49,25 @@ public class RepositoryMetadataInitializer
     public RepositoryMetadata init(Class<?> repositoryClass, BeanManager beanManager)
     {
         RepositoryMetadata repositoryMetadata = new RepositoryMetadata(repositoryClass);
-        
-        repositoryMetadata.setEntityManagerResolverClass(extractEntityManagerResolver(repositoryClass));
-        repositoryMetadata.setEntityManagerFlushMode(extractEntityManagerFlushMode(repositoryClass));
-
-        if (repositoryMetadata.getEntityManagerResolverClass() != null)
+        // read from looks for JPA Transactional and EntityManagerConfig to determine attributes
+        // if those are set, don't process old annotations
+        if (!repositoryMetadata.readFrom(repositoryClass, beanManager))
         {
-            Set<Bean<?>> beans = beanManager.getBeans(repositoryMetadata.getEntityManagerResolverClass());
-            Class<? extends Annotation> scope = beanManager.resolve(beans).getScope();
+            repositoryMetadata.setEntityManagerResolverClass(extractEntityManagerResolver(repositoryClass));
+            repositoryMetadata.setEntityManagerFlushMode(extractEntityManagerFlushMode(repositoryClass));
 
-            repositoryMetadata.setEntityManagerResolverIsNormalScope(beanManager.isNormalScope(scope));
-        }
-        else
-        {
-            repositoryMetadata.setEntityManagerResolverIsNormalScope(false);
+            if (repositoryMetadata.getEntityManagerResolverClass() != null)
+            {
+                Set<Bean<?>> beans = beanManager.getBeans(repositoryMetadata.getEntityManagerResolverClass());
+                Class<? extends Annotation> scope = beanManager.resolve(beans).getScope();
+                repositoryMetadata.setEntityManagerResolverIsNormalScope(beanManager.isNormalScope(scope));
+            }
+            else
+            {
+                repositoryMetadata.setEntityManagerResolverIsNormalScope(false);
+            }
         }
-        
         repositoryMetadata.setEntityMetadata(entityMetadataInitializer.init(repositoryMetadata));
-
         initializeMethodsMetadata(repositoryMetadata, beanManager);
         
         return repositoryMetadata;

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerTest.java
index 608052a..a38c307 100644
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerTest.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerTest.java
@@ -29,10 +29,7 @@ import javax.inject.Inject;
 
 import org.apache.deltaspike.data.api.QueryInvocationException;
 import org.apache.deltaspike.data.test.domain.Simple;
-import org.apache.deltaspike.data.test.service.SimpleRepositoryWithEntityManager;
-import org.apache.deltaspike.data.test.service.SimpleRepositoryWithEntityManagerResolver;
-import org.apache.deltaspike.data.test.service.Simplistic;
-import org.apache.deltaspike.data.test.service.SimplisticEntityManagerResolver;
+import org.apache.deltaspike.data.test.service.*;
 import org.apache.deltaspike.test.category.WebProfileCategory;
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
@@ -55,10 +52,15 @@ public class EntityManagerTest
                         SimpleRepositoryWithEntityManagerResolver.class,
                         QualifiedEntityManagerTestProducer.class,
                         NonQualifiedEntityManagerTestProducer.class,
+                        BasicEntityManagerResolver.class,
+                        LegacyRepositoryWithEntityManagerResolver.class,
                         Simplistic.class, SimplisticEntityManagerResolver.class);
     }
 
     @Inject
+    private LegacyRepositoryWithEntityManagerResolver legacyRepository;
+
+    @Inject
     private SimpleRepositoryWithEntityManager repoWithDefaultEm;
 
     @Inject
@@ -89,4 +91,15 @@ public class EntityManagerTest
         fail("Fake EM should have thrown Exception");
     }
 
+    @Test
+    public void shouldWorkWithLegacyConfigAsWell()
+    {
+        // when
+        List<Simple> result = repoWithDefaultEm.findByName("testUseQualifiedEntityManager");
+
+        // then
+        assertNotNull(result);
+        assertEquals(0, result.size());
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/BasicEntityManagerResolver.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/BasicEntityManagerResolver.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/BasicEntityManagerResolver.java
new file mode 100644
index 0000000..7b75b37
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/BasicEntityManagerResolver.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.deltaspike.data.test.service;
+
+import org.apache.deltaspike.data.api.EntityManagerResolver;
+
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+
+public class BasicEntityManagerResolver implements EntityManagerResolver
+{
+
+    @Inject
+    private EntityManager entityManager;
+
+    @Override
+    public EntityManager resolveEntityManager()
+    {
+        return entityManager;
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/LegacyRepositoryWithEntityManagerResolver.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/LegacyRepositoryWithEntityManagerResolver.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/LegacyRepositoryWithEntityManagerResolver.java
new file mode 100644
index 0000000..c619173
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/LegacyRepositoryWithEntityManagerResolver.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.deltaspike.data.test.service;
+
+import org.apache.deltaspike.data.api.AbstractEntityRepository;
+import org.apache.deltaspike.data.api.EntityManagerConfig;
+import org.apache.deltaspike.data.api.Repository;
+import org.apache.deltaspike.data.test.domain.Simple;
+
+import java.util.List;
+
+@Repository
+@EntityManagerConfig(entityManagerResolver = BasicEntityManagerResolver.class)
+public abstract class LegacyRepositoryWithEntityManagerResolver extends AbstractEntityRepository<Simple, Long>
+{
+
+    public abstract List<Simple> findByName(String name);
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleRepositoryWithEntityManagerResolver.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleRepositoryWithEntityManagerResolver.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleRepositoryWithEntityManagerResolver.java
index dc82e2d..118ae91 100644
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleRepositoryWithEntityManagerResolver.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleRepositoryWithEntityManagerResolver.java
@@ -21,9 +21,9 @@ package org.apache.deltaspike.data.test.service;
 import java.util.List;
 
 import org.apache.deltaspike.data.api.AbstractEntityRepository;
-import org.apache.deltaspike.data.api.EntityManagerConfig;
 import org.apache.deltaspike.data.api.Repository;
 import org.apache.deltaspike.data.test.domain.Simple;
+import org.apache.deltaspike.jpa.api.entitymanager.EntityManagerConfig;
 
 @Repository
 @EntityManagerConfig(entityManagerResolver = SimplisticEntityManagerResolver.class)

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimplisticEntityManagerResolver.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimplisticEntityManagerResolver.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimplisticEntityManagerResolver.java
index 14f6511..851d0f4 100644
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimplisticEntityManagerResolver.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimplisticEntityManagerResolver.java
@@ -18,11 +18,11 @@
  */
 package org.apache.deltaspike.data.test.service;
 
+import org.apache.deltaspike.data.api.EntityManagerResolver;
+
 import javax.inject.Inject;
 import javax.persistence.EntityManager;
 
-import org.apache.deltaspike.data.api.EntityManagerResolver;
-
 public class SimplisticEntityManagerResolver implements EntityManagerResolver
 {
 

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/api/entitymanager/EntityManagerConfig.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/api/entitymanager/EntityManagerConfig.java b/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/api/entitymanager/EntityManagerConfig.java
new file mode 100644
index 0000000..0155916
--- /dev/null
+++ b/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/api/entitymanager/EntityManagerConfig.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.deltaspike.jpa.api.entitymanager;
+
+import javax.enterprise.inject.Any;
+import javax.persistence.FlushModeType;
+import java.lang.annotation.Annotation;
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Configure the EntityManager for a specific repository.
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+public @interface EntityManagerConfig
+{
+    /**
+     * References the type which provides the EntityManager for a specific repository.
+     * Must be resolvable over the BeanManager.
+     */
+    Class<? extends EntityManagerResolver> entityManagerResolver() default EntityManagerResolver.class;
+
+    /**
+     * If no entityManagerResolver is specified, then these qualifiers will be used to look up an entity manager
+     * @return
+     */
+    Class<? extends Annotation>[] qualifier() default Any.class;
+
+    /**
+     * Set the flush mode for the repository EntityManager.
+     */
+    FlushModeType flushMode() default FlushModeType.AUTO;
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/api/entitymanager/EntityManagerResolver.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/api/entitymanager/EntityManagerResolver.java b/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/api/entitymanager/EntityManagerResolver.java
new file mode 100644
index 0000000..b0c5321
--- /dev/null
+++ b/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/api/entitymanager/EntityManagerResolver.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.deltaspike.jpa.api.entitymanager;
+
+import javax.persistence.EntityManager;
+
+/**
+ * Resolve the EntityManager used for a specific repository.
+ * Only necessary if there is more than one persistence unit.
+ *
+ * The container will look in the following order:
+ * - A configured {@link EntityManagerConfig}
+ * - A bean of type <code>EntityManagerResolver</code>
+ * - Otherwise we'll assume there's a single {@link EntityManager}.
+ */
+public interface EntityManagerResolver
+{
+    EntityManager resolveEntityManager();
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/api/transaction/Transactional.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/api/transaction/Transactional.java b/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/api/transaction/Transactional.java
index ba5fec7..00bca2f 100644
--- a/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/api/transaction/Transactional.java
+++ b/deltaspike/modules/jpa/api/src/main/java/org/apache/deltaspike/jpa/api/transaction/Transactional.java
@@ -58,8 +58,13 @@ public @interface Transactional
      * {@link javax.persistence.EntityManager}s with qualifiers in a called method (of a different bean)
      * which isn't {@link Transactional} itself.
      *
+     * This method is now deprecated, and if you have multiple {@link javax.persistence.EntityManager}s you should use
+     * {@link org.apache.deltaspike.jpa.api.entitymanager.EntityManagerResolver}.
+     * If you want to use qualifiers only, use {@link org.apache.deltaspike.jpa.api.entitymanager.EntityManagerConfig}.
+     *
      * @return target persistence-unit identifier
      */
+    @Deprecated
     @Nonbinding Class<? extends Annotation>[] qualifier() default Any.class;
 
     /**

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/entitymanager/EntityManagerMetadata.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/entitymanager/EntityManagerMetadata.java b/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/entitymanager/EntityManagerMetadata.java
new file mode 100644
index 0000000..1e9b902
--- /dev/null
+++ b/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/entitymanager/EntityManagerMetadata.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.deltaspike.jpa.impl.entitymanager;
+
+import org.apache.deltaspike.jpa.api.entitymanager.EntityManagerConfig;
+import org.apache.deltaspike.jpa.api.entitymanager.EntityManagerResolver;
+import org.apache.deltaspike.jpa.api.transaction.Transactional;
+
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.persistence.FlushModeType;
+import java.lang.annotation.Annotation;
+import java.util.Set;
+
+public class EntityManagerMetadata
+{
+    private Class<? extends EntityManagerResolver> entityManagerResolverClass;
+    private Class<? extends Annotation>[] qualifiers;
+    private boolean entityManagerResolverIsNormalScope;
+    private FlushModeType entityManagerFlushMode;
+
+    public Class<? extends EntityManagerResolver> getEntityManagerResolverClass()
+    {
+        return entityManagerResolverClass;
+    }
+
+    public void setEntityManagerResolverClass(Class<? extends EntityManagerResolver> entityManagerResolverClass)
+    {
+        this.entityManagerResolverClass = entityManagerResolverClass;
+    }
+
+    public FlushModeType getEntityManagerFlushMode()
+    {
+        return entityManagerFlushMode;
+    }
+
+    public void setEntityManagerFlushMode(FlushModeType entityManagerFlushMode)
+    {
+        this.entityManagerFlushMode = entityManagerFlushMode;
+    }
+
+    public boolean isEntityManagerResolverIsNormalScope()
+    {
+        return entityManagerResolverIsNormalScope;
+    }
+
+    public void setEntityManagerResolverIsNormalScope(boolean entityManagerResolverIsNormalScope)
+    {
+        this.entityManagerResolverIsNormalScope = entityManagerResolverIsNormalScope;
+    }
+
+    public Class<? extends Annotation>[] getQualifiers()
+    {
+        return qualifiers;
+    }
+
+    public void setQualifiers(Class<? extends Annotation>[] qualifiers)
+    {
+        this.qualifiers = qualifiers;
+    }
+
+    public boolean readFrom(Class<?> componentClass, BeanManager beanManager)
+    {
+        EntityManagerConfig entityManagerConfig = componentClass.getAnnotation(EntityManagerConfig.class);
+        boolean processed = false;
+        if (entityManagerConfig != null)
+        {
+            processed = true;
+            this.setEntityManagerFlushMode(entityManagerConfig.flushMode());
+            this.setQualifiers(entityManagerConfig.qualifier());
+            Class<? extends EntityManagerResolver> resolverClass = entityManagerConfig.entityManagerResolver();
+            if (!resolverClass.equals(EntityManagerResolver.class))
+            {
+                this.setEntityManagerResolverClass(resolverClass);
+                Set<Bean<?>> beans = beanManager.getBeans(resolverClass);
+                Class<? extends Annotation> scope = beanManager.resolve(beans).getScope();
+                this.setEntityManagerResolverIsNormalScope(beanManager.isNormalScope(scope));
+            }
+            else
+            {
+                this.setEntityManagerResolverIsNormalScope(false);
+            }
+        }
+
+        Transactional transactional = componentClass.getAnnotation(Transactional.class);
+
+        if (transactional != null && this.qualifiers == null)
+        {
+            processed = true;
+            this.setQualifiers(transactional.qualifier());
+        }
+
+        return processed;
+    }
+
+}
+

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/entitymanager/EntityManagerRef.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/entitymanager/EntityManagerRef.java b/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/entitymanager/EntityManagerRef.java
new file mode 100644
index 0000000..c28e866
--- /dev/null
+++ b/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/entitymanager/EntityManagerRef.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.deltaspike.jpa.impl.entitymanager;
+
+import javax.persistence.EntityManager;
+import org.apache.deltaspike.core.api.provider.DependentProvider;
+import org.apache.deltaspike.jpa.api.entitymanager.EntityManagerResolver;
+
+public class EntityManagerRef
+{
+    private EntityManager entityManager;
+    private DependentProvider<? extends EntityManager> entityManagerDependentProvider;
+    
+    private Class<? extends EntityManagerResolver> entityManagerResolverClass;
+    private EntityManagerResolver entityManagerResolver;
+    private DependentProvider<? extends EntityManagerResolver> entityManagerResolverDependentProvider;
+        
+    public void release()
+    {
+        if (entityManagerDependentProvider != null)
+        {
+            entityManagerDependentProvider.destroy();
+        }
+        
+        if (entityManagerResolverDependentProvider != null)
+        {
+            entityManagerResolverDependentProvider.destroy();
+        }
+    }
+
+    public Class<? extends EntityManagerResolver> getEntityManagerResolverClass()
+    {
+        return entityManagerResolverClass;
+    }
+
+    public void setEntityManagerResolverClass(Class<? extends EntityManagerResolver> entityManagerResolverClass)
+    {
+        this.entityManagerResolverClass = entityManagerResolverClass;
+    }
+
+    public DependentProvider<? extends EntityManagerResolver> getEntityManagerResolverDependentProvider()
+    {
+        return entityManagerResolverDependentProvider;
+    }
+
+    public void setEntityManagerResolverDependentProvider(
+            DependentProvider<? extends EntityManagerResolver> entityManagerResolverDependentProvider)
+    {
+        this.entityManagerResolverDependentProvider = entityManagerResolverDependentProvider;
+    }
+
+    public EntityManager getEntityManager()
+    {
+        return entityManager;
+    }
+
+    public void setEntityManager(EntityManager entityManager)
+    {
+        this.entityManager = entityManager;
+    }
+
+    public EntityManagerResolver getEntityManagerResolver()
+    {
+        return entityManagerResolver;
+    }
+
+    public void setEntityManagerResolver(EntityManagerResolver entityManagerResolver)
+    {
+        this.entityManagerResolver = entityManagerResolver;
+    }
+
+    public DependentProvider<? extends EntityManager> getEntityManagerDependentProvider()
+    {
+        return entityManagerDependentProvider;
+    }
+
+    public void setEntityManagerDependentProvider(
+            DependentProvider<? extends EntityManager> entityManagerDependentProvider)
+    {
+        this.entityManagerDependentProvider = entityManagerDependentProvider;
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/25643153/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/entitymanager/EntityManagerRefLookup.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/entitymanager/EntityManagerRefLookup.java b/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/entitymanager/EntityManagerRefLookup.java
new file mode 100644
index 0000000..4566102
--- /dev/null
+++ b/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/entitymanager/EntityManagerRefLookup.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.deltaspike.jpa.impl.entitymanager;
+
+import java.util.Set;
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import org.apache.deltaspike.core.api.provider.BeanManagerProvider;
+
+import org.apache.deltaspike.core.api.provider.BeanProvider;
+import org.apache.deltaspike.jpa.spi.entitymanager.ActiveEntityManagerHolder;
+
+@ApplicationScoped
+public class EntityManagerRefLookup
+{
+    @Inject
+    private ActiveEntityManagerHolder activeEntityManagerHolder;
+
+    private volatile Boolean globalEntityManagerInitialized;
+    private boolean globalEntityManagerIsNormalScope;
+    private EntityManager globalEntityManager;
+    
+    private void lazyInitGlobalEntityManager()
+    {
+        if (this.globalEntityManagerInitialized == null)
+        {
+            initGlobalEntityManager();
+        }
+    }
+
+    private synchronized void initGlobalEntityManager()
+    {
+        // switch into paranoia mode
+        if (this.globalEntityManagerInitialized == null)
+        {
+            this.globalEntityManagerInitialized = true;
+            
+            BeanManager beanManager = BeanManagerProvider.getInstance().getBeanManager();
+            Set<Bean<?>> beans = beanManager.getBeans(EntityManager.class);
+            Bean<?> bean = beanManager.resolve(beans);
+
+            if (bean == null)
+            {
+                throw new IllegalStateException("Could not find EntityManager with default qualifier.");
+            }
+            
+            globalEntityManagerIsNormalScope = beanManager.isNormalScope(bean.getScope());
+            if (globalEntityManagerIsNormalScope)
+            {
+                globalEntityManager = (EntityManager) beanManager.getReference(bean,
+                        EntityManager.class,
+                        beanManager.createCreationalContext(bean));       
+            }
+        }
+    }
+    
+    public EntityManagerRef lookupReference(final EntityManagerMetadata entityManagerMetadata)
+    {
+        EntityManagerRef ref = new EntityManagerRef();
+
+        if (entityManagerMetadata.getEntityManagerResolverClass() != null)
+        {
+            ref.setEntityManagerResolverClass(entityManagerMetadata.getEntityManagerResolverClass());
+            
+            if (entityManagerMetadata.isEntityManagerResolverIsNormalScope())
+            {
+                ref.setEntityManagerResolver(
+                        BeanProvider.getContextualReference(ref.getEntityManagerResolverClass()));
+            }
+            else
+            {
+                ref.setEntityManagerResolverDependentProvider(
+                        BeanProvider.getDependent(ref.getEntityManagerResolverClass()));
+
+                ref.setEntityManagerResolver(
+                        ref.getEntityManagerResolverDependentProvider().get());
+            }
+            
+            ref.setEntityManager(
+                    ref.getEntityManagerResolver().resolveEntityManager());
+        }
+        else
+        {
+            if (activeEntityManagerHolder.isSet())
+            {
+                ref.setEntityManager(
+                        activeEntityManagerHolder.get());
+                
+                // TODO should we really not apply the FlushMode on the active EntityManager?
+                return ref;
+            }
+            else
+            {
+                lazyInitGlobalEntityManager();
+                if (globalEntityManagerIsNormalScope)
+                {
+                    ref.setEntityManager(globalEntityManager);
+                }
+                else
+                {
+                    ref.setEntityManagerDependentProvider(
+                            BeanProvider.getDependent(EntityManager.class));
+                    ref.setEntityManager(
+                            ref.getEntityManagerDependentProvider().get());
+                }
+            }
+        }
+
+        if (entityManagerMetadata.getEntityManagerFlushMode() != null)
+        {
+            ref.getEntityManager().setFlushMode(entityManagerMetadata.getEntityManagerFlushMode());
+        }
+
+        return ref;
+    }
+}