Skip to content

Commit

Permalink
Make Seam Managed Hibernate Sessions work when the conversation conte…
Browse files Browse the repository at this point in the history
…xt is not active
  • Loading branch information
stuartwdouglas committed Oct 28, 2010
1 parent 46afd86 commit c935661
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 8 deletions.
Expand Up @@ -108,9 +108,16 @@ public Session create(Bean<Session> bean, CreationalContext<Session> 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;
Expand Down Expand Up @@ -151,7 +158,7 @@ private PersistenceContexts getPersistenceContexts()
}

/**
* lazily resolve the relevant EMF
* lazily resolve the relevant SessionFactory
*/
protected SessionFactory getSessionFactory()
{
Expand Down
Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -69,10 +72,12 @@ public class HibernateManagedSessionProxyHandler implements InvocationHandler, S

private transient boolean synchronizationRegistered;

private final PersistenceContexts persistenceContexts;
private PersistenceContexts persistenceContexts;

private final Set<Annotation> qualifiers;

protected final BeanManager manager;

private final HibernatePersistenceProvider provider;

private boolean persistenceContextsTouched = false;
Expand All @@ -83,14 +88,14 @@ public class HibernateManagedSessionProxyHandler implements InvocationHandler, S

private final Instance<Expressions> expressionsInstance;

public HibernateManagedSessionProxyHandler(Session delegate, BeanManager beanManager, Set<Annotation> qualifiers, PersistenceContexts persistenceContexts, HibernatePersistenceProvider provider)
public HibernateManagedSessionProxyHandler(Session delegate, BeanManager beanManager, Set<Annotation> 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
Expand Down Expand Up @@ -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)
{
Expand All @@ -242,4 +247,19 @@ public void beforeCompletion()

}

private PersistenceContexts getPersistenceContexts()
{
if (persistenceContexts == null)
{
Bean<PersistenceContexts> bean = (Bean) manager.resolve(manager.getBeans(PersistenceContexts.class, DefaultLiteral.INSTANCE));
if (bean == null)
{
throw new RuntimeException("Could not find PersistenceContexts bean");
}
CreationalContext<PersistenceContexts> ctx = manager.createCreationalContext(bean);
persistenceContexts = (PersistenceContexts) manager.getReference(bean, PersistenceContexts.class, ctx);
}
return persistenceContexts;
}

}

0 comments on commit c935661

Please sign in to comment.