diff --git a/impl/src/main/java/org/jboss/seam/persistence/hibernate/HibernateManagedSessionBeanLifecycle.java b/impl/src/main/java/org/jboss/seam/persistence/hibernate/HibernateManagedSessionBeanLifecycle.java index c4068cc..a8269bb 100644 --- a/impl/src/main/java/org/jboss/seam/persistence/hibernate/HibernateManagedSessionBeanLifecycle.java +++ b/impl/src/main/java/org/jboss/seam/persistence/hibernate/HibernateManagedSessionBeanLifecycle.java @@ -108,9 +108,16 @@ public Session create(Bean bean, CreationalContext arg0) SessionFactory sf = getSessionFactory(); Session session = sf.openSession(); session = (Session) persistenceProvider.proxyDelegate(session); - HibernateManagedSessionProxyHandler handler = new HibernateManagedSessionProxyHandler(session, manager, bean.getQualifiers(), getPersistenceContexts(), persistenceProvider); + HibernateManagedSessionProxyHandler handler = new HibernateManagedSessionProxyHandler(session, manager, bean.getQualifiers(), persistenceProvider, manager); Session proxy = (Session) proxyConstructor.newInstance(handler); - ((ManagedPersistenceContext) proxy).changeFlushMode(getPersistenceContexts().getFlushMode()); + try + { + ((ManagedPersistenceContext) proxy).changeFlushMode(getPersistenceContexts().getFlushMode()); + } + catch (ContextNotActiveException e) + { + + } manager.fireEvent(new SeamManagedHibernateSessionCreated(proxy), qualifiers); return proxy; @@ -151,7 +158,7 @@ private PersistenceContexts getPersistenceContexts() } /** - * lazily resolve the relevant EMF + * lazily resolve the relevant SessionFactory */ protected SessionFactory getSessionFactory() { diff --git a/impl/src/main/java/org/jboss/seam/persistence/hibernate/HibernateManagedSessionProxyHandler.java b/impl/src/main/java/org/jboss/seam/persistence/hibernate/HibernateManagedSessionProxyHandler.java index 94ccbce..37adf66 100644 --- a/impl/src/main/java/org/jboss/seam/persistence/hibernate/HibernateManagedSessionProxyHandler.java +++ b/impl/src/main/java/org/jboss/seam/persistence/hibernate/HibernateManagedSessionProxyHandler.java @@ -29,7 +29,9 @@ import java.util.Set; import javax.enterprise.context.ContextNotActiveException; +import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.inject.Instance; +import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; import javax.persistence.EntityManager; import javax.transaction.Synchronization; @@ -47,6 +49,7 @@ import org.jboss.seam.persistence.transaction.literal.DefaultTransactionLiteral; import org.jboss.seam.persistence.util.InstanceResolver; import org.jboss.weld.extensions.el.Expressions; +import org.jboss.weld.extensions.literal.DefaultLiteral; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -69,10 +72,12 @@ public class HibernateManagedSessionProxyHandler implements InvocationHandler, S private transient boolean synchronizationRegistered; - private final PersistenceContexts persistenceContexts; + private PersistenceContexts persistenceContexts; private final Set qualifiers; + protected final BeanManager manager; + private final HibernatePersistenceProvider provider; private boolean persistenceContextsTouched = false; @@ -83,14 +88,14 @@ public class HibernateManagedSessionProxyHandler implements InvocationHandler, S private final Instance expressionsInstance; - public HibernateManagedSessionProxyHandler(Session delegate, BeanManager beanManager, Set qualifiers, PersistenceContexts persistenceContexts, HibernatePersistenceProvider provider) + public HibernateManagedSessionProxyHandler(Session delegate, BeanManager beanManager, Set qualifiers, HibernatePersistenceProvider provider, BeanManager manager) { this.qualifiers = qualifiers; this.provider = provider; this.delegate = delegate; this.userTransactionInstance = InstanceResolver.getInstance(SeamTransaction.class, beanManager, DefaultTransactionLiteral.INSTANCE); - this.persistenceContexts = persistenceContexts; - expressionsInstance = InstanceResolver.getInstance(Expressions.class, beanManager); + this.expressionsInstance = InstanceResolver.getInstance(Expressions.class, beanManager); + this.manager = manager; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable @@ -218,7 +223,7 @@ void touch(ManagedPersistenceContext delegate) { // we need to do this first to prevent an infinite loop persistenceContextsTouched = true; - persistenceContexts.touch(delegate); + getPersistenceContexts().touch(delegate); } catch (ContextNotActiveException e) { @@ -242,4 +247,19 @@ public void beforeCompletion() } + private PersistenceContexts getPersistenceContexts() + { + if (persistenceContexts == null) + { + Bean bean = (Bean) manager.resolve(manager.getBeans(PersistenceContexts.class, DefaultLiteral.INSTANCE)); + if (bean == null) + { + throw new RuntimeException("Could not find PersistenceContexts bean"); + } + CreationalContext ctx = manager.createCreationalContext(bean); + persistenceContexts = (PersistenceContexts) manager.getReference(bean, PersistenceContexts.class, ctx); + } + return persistenceContexts; + } + }