THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
...
Code Block | ||||
---|---|---|---|---|
| ||||
import net.sf.hibernate.FlushMode; import net.sf.hibernate.Session; import net.sf.hibernate.SessionFactory; import org.springframework.orm.hibernate.SessionFactoryUtils; import org.springframework.orm.hibernate.SessionHolder; import org.springframework.transaction.support.TransactionSynchronizationManager; import com.opensymphony.webwork.interceptor.BackgroundProcess; import com.opensymphony.xwork.ActionInvocation; /** * The OpenSessionBackgroundProcess, when instantiated with a * HibernateSessionFactory, will open a session, enable Spring's transaction * management capabilities, and bind the Session to the background thread. * */ public class OpenSessionBackgroundProcess extends BackgroundProcess { SessionFactory sessionFactory; Session openSession; public class OpenSessionBackgroundProcess extends BackgroundProcess { SessionFactory sessionFactory; Session openSession; protected boolean initializationComplete = false; private Object lock = new Object(); // used for synchronization public OpenSessionBackgroundProcess(String name, ActionInvocation invocation, int threadPriority, SessionFactory factory) { super(name, invocation, threadPriority); this.sessionFactory = factory; initializationComplete = true; synchronized (lock) { lock.notify(); } } protected void beforeInvocation() throws Exception { while (!initializationComplete) { try { synchronized (lock) { lock.wait(100); } } catch (InterruptedException e) { // behavior ignores cause of re-awakening. } } openSession = SessionFactoryUtils.getSession(sessionFactory, true); openSession.setFlushMode(FlushMode.NEVER); TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(openSession)); super.beforeInvocation(); } protected void afterInvocation() throws Exception { super.afterInvocation(); TransactionSynchronizationManager.unbindResource(sessionFactory); SessionFactoryUtils .closeSessionIfNecessary(openSession, sessionFactory); } } |