title: Spring-Hibernate : Illegal attempt to associate a collection with two open sessions
body: <p>I am trying to update record in MySql Db. while updating it threw following exception</p>
  
  <pre><code>org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
  at org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:410)
  at org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:43)
  at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
  at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61)
  at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55)
  at org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:123)
  at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:293)
  at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223)
  at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:89)
  at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
  at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
  at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
  at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495)
  at com.tcs.ignite.ih.spring.dao.UserDAOImpl.saveUpdateUserbean(UserDAOImpl.java:185)
  at com.tcs.ignite.ih.spring.dao.UserDAOImpl.blockuser(UserDAOImpl.java:204)
  at com.tcs.ignite.ih.spring.service.UserServiceImpl.blockUser(UserServiceImpl.java:187)
  at com.tcs.ignite.ih.spring.controller.AdminHomeController.BlockUser(AdminHomeController.java:48)
  </code></pre>
  
  <p>I check for the session. Its closes in Finally block of every methode . Not able to figure out what is wrong. I am able to to insertupdate opertion with other methods without any problem but only saveUpdateUserBean method is throwing exception</p>
  
  <p>UserDAOImpl:</p>
  
  <pre><code>import com.tcs.ignite.ih.hibernate.model.Userdetails;
  import com.tcs.ignite.ih.hibernate.model.Userlog;
  import com.tcs.ignite.ih.hibernate.model.Userrole;
  import com.tcs.ignite.ih.spring.bean.LoginBean;
  import com.tcs.ignite.ih.spring.util.LogFile;
  import java.util.List;
  import org.hibernate.Hibernate;
  import org.hibernate.SQLQuery;
  import org.hibernate.Session;
  import org.hibernate.SessionFactory;
  import org.hibernate.Transaction;
  import org.hibernate.criterion.Restrictions;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.stereotype.Repository;
  import org.springframework.transaction.annotation.Transactional;
  
  
  @Repository
  @Transactional
  public class UserDAOImpl implements UserDAO {
  
  @Autowired
  private SessionFactory sessionFactory;
  
  public SessionFactory getSessionFactory() {
      return sessionFactory;
  }
  
  public void setSessionFactory(SessionFactory sessionFactory) {
      this.sessionFactory = sessionFactory;
  }
  
  
  @Override
  public Userdetails getUserDetails(String username) {
      Session session = getSessionFactory().openSession();
      Userdetails u = null;
      try {
          u = (Userdetails) getSessionFactory().openSession()
                  .createCriteria(Userdetails.class)
                  .add(Restrictions.eq("email", username)).uniqueResult();
      } catch (Exception e) {
          LogFile.log.error("UserDAO getuserDetails(): " + e.toString());
      } finally {
          if (session.isOpen()) {
              session.close();
          }
          return u;
      }
  }
  
  @Override
  public boolean saveUpdateUserbean(Userdetails u) {
  
      Session session = getSessionFactory().openSession();
      Transaction tr = session.beginTransaction();
      boolean y = false;
      try {
          session.saveOrUpdate(u);
          tr.commit();
          y = true;
      } catch (Exception e) {
          tr.rollback();
          e.printStackTrace();
      } finally {
          if (session.isOpen()) {
              session.close();
          }
          return y;
      }
  }
  
  @Override
  public boolean blockuser(String email) {
      Userdetails u = this.getUserDetails(email);
      return this.saveUpdateUserbean(u);
  }
  }
  </code></pre>
  
  <p>ServiceImpl:</p>
  
  <pre><code>    import com.tcs.ignite.ih.hibernate.model.Userdetails;
  import com.tcs.ignite.ih.hibernate.model.Userlog;
  import com.tcs.ignite.ih.spring.bean.LogBean;
  import com.tcs.ignite.ih.spring.bean.RegisterBean;
  import com.tcs.ignite.ih.spring.bean.UserBean;
  import com.tcs.ignite.ih.spring.bean.loadUserBean;
  import com.tcs.ignite.ih.spring.dao.UserDAO;
  import com.tcs.ignite.ih.spring.util.Time;
  import java.sql.Timestamp;
  import java.text.SimpleDateFormat;
  import java.util.ArrayList;
  import java.util.Date;
  import java.util.List;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.stereotype.Service;
  import org.springframework.transaction.annotation.Transactional;
  
  @Service
  public class UserServiceImpl implements UserService {
  
  @Autowired
  UserDAO dao;
  
  @Override
  public boolean blockUser(String email) {
     return dao.blockuser(email);
  }
  }
  </code></pre>
  
  <p>applicationContext.xml:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  &lt;beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:p="http://www.springframework.org/schema/p"
     xmlns:aop="http://www.springframework.org/schema/aop"
     xmlns:tx="http://www.springframework.org/schema/tx"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"&gt;
  
  &lt;bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        p:location="classpath:jdbc.properties" /&gt;
  
  &lt;bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource"
        p:driverClassName="${jdbc.driverClassName}"
        p:url="${jdbc.url}"
        p:username="${jdbc.username}"
        p:password="${jdbc.password}"/&gt;
  
  &lt;!-- ADD PERSISTENCE SUPPORT HERE (jpa, hibernate, etc) --&gt;
  &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"&gt;
      &lt;property name="dataSource" ref="dataSource"/&gt;
      &lt;property name="packagesToScan" value="com.tcs.ignite.ih.hibernate.model" /&gt;
      &lt;property name="hibernateProperties"&gt;
          &lt;props&gt;
              &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/prop&gt;
          &lt;/props&gt;
      &lt;/property&gt;
  &lt;/bean&gt;
  
  &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;
      &lt;property name="sessionFactory" ref="sessionFactory"/&gt; 
  &lt;/bean&gt;
  &lt;tx:annotation-driven /&gt;
  &lt;/beans&gt;
  </code></pre>
  
  <p>I am able to perform all database operation using same configuration but when i am calling blockuser() method from serviceImpl its calling DAO methods and the saveupdateUserBean is throwing above exception? m i missing anything?</p>