If you don't destroy it you'll likely leak. And once again you are in your case where you handle the emf yourself. In other cases @Dependent should work fine.
That said nothing again preventing using @Dependent so just do it If it solves the issue. Normal scopes were the important part for me. *Romain Manni-Bucau* *Twitter: @rmannibucau <https://twitter.com/rmannibucau>* *Blog: **http://rmannibucau.wordpress.com/*<http://rmannibucau.wordpress.com/> *LinkedIn: **http://fr.linkedin.com/in/rmannibucau* *Github: https://github.com/rmannibucau* 2013/10/10 Mark Struberg <strub...@yahoo.de> > > >Both works > > That's exactly where I disagree. While both 'work' in the sample, > immediately destroying the instances again after creating them - and only > later returning the java reference to the now 'dead' EntityManagerResolver > - is broken if you will use it in productive scenarios. > > > Either we fix this, or we don't need any special handling. In this case I > suggest to just use DependentProvider.get() for all cases. It has no harm > on NormalScoped instances anyway. > > I will guard DependentProvider#destroy to not have any impact on > @Dependent scoped instances. > > > LieGrue, > strub > > > >________________________________ > > From: Romain Manni-Bucau <rmannibu...@gmail.com> > >To: "dev@deltaspike.apache.org" <dev@deltaspike.apache.org>; Mark > Struberg <strub...@yahoo.de> > >Sent: Thursday, 10 October 2013, 8:33 > >Subject: Re: git commit: DELTASPIKE-424 taking into account > EntityManagerResolver with a normal scope > > > > > > > >Both works Mark depending as you said from where you take your em. We > just need to be explicit on this behavior. BTW I prefer the normal scope > usage too. > > > > > >Romain Manni-Bucau > >Twitter: @rmannibucau > >Blog: http://rmannibucau.wordpress.com/ > >LinkedIn: http://fr.linkedin.com/in/rmannibucau > >Github: https://github.com/rmannibucau > > > > > > > > > >2013/10/10 Mark Struberg <strub...@yahoo.de> > > > >Not sure if we really need this flag. > >>The most important question to me is _when_ do we trigger the destroy() > method. > >> > >>The following code doesn't make much sense imo: > >> > >>> final DependentProvider<? extends EntityManagerResolver> resolver = > lookupResolver(emrc); > >>> result = resolver.get().resolveEntityManager(); > >>> resolver.destroy(); > >> > >> > >>The DependentProvider is intended to store it's instances somewhere to > be able to properly destroy the created @Dependent instance once you don't > need it anymore. Invoking destroy() immediately but returning the created > contextual instance makes no sense imo. Imagine what happens if you would > close the EntityManagerFactory in a @PreDestroy method. > >> > >>If there is no clean way to clean up the instance again, then we should > only rely on NormalScoped instances and remove the handling (and get the > warnings again, because they make sense). > >> > >>LieGrue, > >>strub > >> > >> > >> > >> > >> > >> > >> > >>----- Original Message ----- > >>> From: "rmannibu...@apache.org" <rmannibu...@apache.org> > >>> To: comm...@deltaspike.apache.org > >>> Cc: > >>> Sent: Wednesday, 9 October 2013, 16:46 > >>> Subject: git commit: DELTASPIKE-424 taking into account > EntityManagerResolver with a normal scope > >>> > >>> Updated Branches: > >>> refs/heads/master bdc9cdce6 -> e8148110e > >>> > >>> > >>> DELTASPIKE-424 taking into account EntityManagerResolver with a normal > scope > >>> > >>> > >>> Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo > >>> Commit: > http://git-wip-us.apache.org/repos/asf/deltaspike/commit/e8148110 > >>> Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/e8148110 > >>> Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/e8148110 > >>> > >>> Branch: refs/heads/master > >>> Commit: e8148110ea2458fa2244a439583da0f2adddb482 > >>> Parents: bdc9cdc > >>> Author: Romain Manni-Bucau <rmannibu...@apache.org> > >>> Authored: Wed Oct 9 16:46:06 2013 +0200 > >>> Committer: Romain Manni-Bucau <rmannibu...@apache.org> > >>> Committed: Wed Oct 9 16:46:06 2013 +0200 > >>> > >>> ---------------------------------------------------------------------- > >>> .../data/impl/RepositoryExtension.java | 2 +- > >>> .../data/impl/handler/EntityManagerLookup.java | 20 +++++++++++------ > >>> .../data/impl/meta/RepositoryComponent.java | 23 > +++++++++++++++++++- > >>> .../data/impl/meta/RepositoryComponents.java | 16 ++++++++------ > >>> .../data/impl/builder/part/QueryRootTest.java | 5 ++--- > >>> 5 files changed, 47 insertions(+), 19 deletions(-) > >>> ---------------------------------------------------------------------- > >>> > >>> > >>> > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/e8148110/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java > >>> ---------------------------------------------------------------------- > >>> diff --git > >>> > a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java > >>> > b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java > >>> index 076393b..8ba0dca 100755 > >>> --- > >>> > a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java > >>> +++ > >>> > b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java > >>> @@ -72,7 +72,7 @@ public class RepositoryExtension implements Extension > >>> { > >>> log.log(Level.FINER, "getHandlerClass: Repository > >>> annotation detected on {0}", > >>> event.getAnnotatedType()); > >>> - RepositoryComponentsFactory.instance().add(repoClass); > >>> + RepositoryComponentsFactory.instance().add(repoClass, > >>> beanManager); > >>> } > >>> catch (RepositoryDefinitionException e) > >>> { > >>> > >>> > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/e8148110/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java > >>> ---------------------------------------------------------------------- > >>> diff --git > >>> > a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java > >>> > b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java > >>> index 5548f16..4554497 100644 > >>> --- > >>> > a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java > >>> +++ > >>> > b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java > >>> @@ -36,15 +36,22 @@ public class EntityManagerLookup > >>> @Any > >>> private Instance<EntityManager> entityManager; > >>> > >>> - public EntityManager lookupFor(RepositoryComponent repository) > >>> + public EntityManager lookupFor(final RepositoryComponent > repository) > >>> { > >>> EntityManager result = null; > >>> if (repository.hasEntityManagerResolver()) > >>> { > >>> - DependentProvider<? extends EntityManagerResolver> > resolver = > >>> - > lookupResolver(repository.getEntityManagerResolverClass()); > >>> - result = resolver.get().resolveEntityManager(); > >>> - resolver.destroy(); > >>> + final Class<? extends EntityManagerResolver> emrc = > >>> repository.getEntityManagerResolverClass(); > >>> + if (!repository.isEntityManagerResolverIsNormalScope()) > >>> + { > >>> + final DependentProvider<? extends > EntityManagerResolver> > >>> resolver = lookupResolver(emrc); > >>> + result = resolver.get().resolveEntityManager(); > >>> + resolver.destroy(); > >>> + } > >>> + else > >>> + { > >>> + result = > >>> BeanProvider.getContextualReference(emrc).resolveEntityManager(); > >>> + } > >>> } > >>> else > >>> { > >>> @@ -60,7 +67,6 @@ public class EntityManagerLookup > >>> private DependentProvider<? extends EntityManagerResolver> > >>> lookupResolver( > >>> Class<? extends EntityManagerResolver> resolverClass) > >>> { > >>> - DependentProvider<? extends EntityManagerResolver> resolver = > >>> BeanProvider.getDependent(resolverClass); > >>> - return resolver; > >>> + return BeanProvider.getDependent(resolverClass); > >>> } > >>> } > >>> > >>> > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/e8148110/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponent.java > >>> ---------------------------------------------------------------------- > >>> diff --git > >>> > a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponent.java > >>> > b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponent.java > >>> index c2dc466..5acee4e 100644 > >>> --- > >>> > a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponent.java > >>> +++ > >>> > b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponent.java > >>> @@ -19,6 +19,7 @@ > >>> package org.apache.deltaspike.data.impl.meta; > >>> > >>> import java.io.Serializable; > >>> +import java.lang.annotation.Annotation; > >>> import java.lang.reflect.Method; > >>> import java.util.Arrays; > >>> import java.util.Collection; > >>> @@ -29,6 +30,8 @@ import java.util.Set; > >>> import java.util.logging.Level; > >>> import java.util.logging.Logger; > >>> > >>> +import javax.enterprise.inject.spi.Bean; > >>> +import javax.enterprise.inject.spi.BeanManager; > >>> import javax.persistence.FlushModeType; > >>> > >>> import org.apache.deltaspike.data.api.EntityManagerConfig; > >>> @@ -53,11 +56,12 @@ public class RepositoryComponent > >>> private final Class<?> repoClass; > >>> private final RepositoryEntity entityClass; > >>> private final Class<? extends EntityManagerResolver> > >>> entityManagerResolver; > >>> + private final boolean entityManagerResolverIsNormalScope; > >>> private final FlushModeType entityManagerFlushMode; > >>> > >>> private final Map<Method, RepositoryMethod> methods = new > >>> HashMap<Method, RepositoryMethod>(); > >>> > >>> - public RepositoryComponent(Class<?> repoClass, RepositoryEntity > >>> entityClass) > >>> + public RepositoryComponent(Class<?> repoClass, RepositoryEntity > >>> entityClass, BeanManager beanManager) > >>> { > >>> if (entityClass == null) > >>> { > >>> @@ -67,9 +71,26 @@ public class RepositoryComponent > >>> this.entityClass = entityClass; > >>> this.entityManagerResolver = > extractEntityManagerResolver(repoClass); > >>> this.entityManagerFlushMode = > extractEntityManagerFlushMode(repoClass); > >>> + > >>> + if (entityManagerResolver != null && beanManager != null) > >>> + { > >>> + final Set<Bean<?>> beans = > >>> beanManager.getBeans(entityManagerResolver); > >>> + final Class<? extends Annotation> scope = > >>> beanManager.resolve(beans).getScope(); > >>> + entityManagerResolverIsNormalScope = > >>> beanManager.isNormalScope(scope); > >>> + } > >>> + else > >>> + { > >>> + entityManagerResolverIsNormalScope = false; > >>> + } > >>> + > >>> initialize(); > >>> } > >>> > >>> + public boolean isEntityManagerResolverIsNormalScope() > >>> + { > >>> + return entityManagerResolverIsNormalScope; > >>> + } > >>> + > >>> public String getEntityName() > >>> { > >>> return EntityUtils.entityName(entityClass.getEntityClass()); > >>> > >>> > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/e8148110/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponents.java > >>> ---------------------------------------------------------------------- > >>> diff --git > >>> > a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponents.java > >>> > b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponents.java > >>> index e6ded42..1bc12db 100644 > >>> --- > >>> > a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponents.java > >>> +++ > >>> > b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponents.java > >>> @@ -18,6 +18,12 @@ > >>> */ > >>> package org.apache.deltaspike.data.impl.meta; > >>> > >>> +import org.apache.deltaspike.data.impl.RepositoryDefinitionException; > >>> +import > >>> > org.apache.deltaspike.data.impl.meta.extractor.AnnotationMetadataExtractor; > >>> +import > org.apache.deltaspike.data.impl.meta.extractor.MetadataExtractor; > >>> +import > org.apache.deltaspike.data.impl.meta.extractor.TypeMetadataExtractor; > >>> + > >>> +import javax.enterprise.inject.spi.BeanManager; > >>> import java.io.Serializable; > >>> import java.lang.reflect.Method; > >>> import java.util.Arrays; > >>> @@ -25,11 +31,6 @@ import java.util.HashMap; > >>> import java.util.List; > >>> import java.util.Map; > >>> > >>> -import org.apache.deltaspike.data.impl.RepositoryDefinitionException; > >>> -import > >>> > org.apache.deltaspike.data.impl.meta.extractor.AnnotationMetadataExtractor; > >>> -import > org.apache.deltaspike.data.impl.meta.extractor.MetadataExtractor; > >>> -import > org.apache.deltaspike.data.impl.meta.extractor.TypeMetadataExtractor; > >>> - > >>> /** > >>> * Convenience class to access Repository and Repository method meta > data. > >>> * Acts as repository for Repository related meta data. > >>> @@ -47,13 +48,14 @@ public class RepositoryComponents implements > Serializable > >>> /** > >>> * Add a Repository class to the meta data repository. > >>> * > >>> + * > >>> * @param repoClass The repo class. > >>> * @return {@code true} if Repository class has been added, > >>> {@code false} otherwise. > >>> */ > >>> - public void add(Class<?> repoClass) > >>> + public void add(Class<?> repoClass, BeanManager bm) > >>> { > >>> RepositoryEntity entityClass = > extractEntityMetaData(repoClass); > >>> - RepositoryComponent repo = new RepositoryComponent(repoClass, > >>> entityClass); > >>> + RepositoryComponent repo = new RepositoryComponent(repoClass, > >>> entityClass, bm); > >>> repos.put(repoClass, repo); > >>> } > >>> > >>> > >>> > http://git-wip-us.apache.org/repos/asf/deltaspike/blob/e8148110/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java > >>> ---------------------------------------------------------------------- > >>> diff --git > >>> > a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java > >>> > b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java > >>> index f904bb2..1c70466 100644 > >>> --- > >>> > a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java > >>> +++ > >>> > b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java > >>> @@ -30,9 +30,8 @@ import org.junit.Test; > >>> > >>> public class QueryRootTest > >>> { > >>> - > >>> - private final RepositoryComponent repo = new > >>> RepositoryComponent(SimpleRepository.class, new > RepositoryEntity(Simple.class, > >>> Long.class)); > >>> - private final RepositoryComponent repoFetchBy = new > >>> RepositoryComponent(SimpleFetchRepository.class, new > >>> RepositoryEntity(Simple.class, Long.class)); > >>> + private final RepositoryComponent repo = new > >>> RepositoryComponent(SimpleRepository.class, new > RepositoryEntity(Simple.class, > >>> Long.class), null); > >>> + private final RepositoryComponent repoFetchBy = new > >>> RepositoryComponent(SimpleFetchRepository.class, new > >>> RepositoryEntity(Simple.class, Long.class), null); > >>> > >>> @Test > >>> public void should_create_simple_query() > >>> > >> > > > > > > >