illegally attempted to associate a proxy with two open Sessions

18,541

Try not to open your session object for all your transactions, instead, open it and close it after everytime you use it, a minimal example taken from what you wrote:

public void delete(Car o) {
    transaction = session.beginTransaction();
    session.delete(o);
    transaction.commit();
}

and

public List<Car> findAll() {
    List<Car> carsList = new ArrayList<Car>();
    try {
        query = session.createQuery("from Car");
        carsList = query.list();
        for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
            Car car = (Car) iterator.next();
        }
    } catch (HibernateException he) {
        he.printStackTrace();
    } finally {

    }
    return carsList;
}

Could be something like this:

public class Transactor {

    public static void delete(Car o) {
        Session session;
        try {
            session = HibernateUtil.getSessionFactory().getCurrentSession();
        } catch (HibernateException ex) {
            session = HibernateUtil.getSessionFactory().openSession();
        }
        Transaction transaction = null;

        try {
            transaction = session.beginTransaction();
            session.delete(o);
            transaction.commit();
        } catch (HibernateException ex) {
            System.out.println("Error deleting car: " + ex);
            if(transaction != null) {
                transaction.rollback();
            }
        } finally {
            if (session.isOpen()){
                session.close();
            }
        }
    }


    public static List<Car> findAll() {
        Session session;
        try {
            session = HibernateUtil.getSessionFactory().getCurrentSession();
        } catch (HibernateException ex) {
            session = HibernateUtil.getSessionFactory().openSession();
        }
        List<Car> carsList = new ArrayList<>();
        try {
            carsList = session.createQuery("from Car").list();
        } catch (HibernateException he) {
            System.out.println("Error getting cars: " + he);
            he.printStackTrace();
        } finally {
            if (session.isOpen()){
                session.close();
            }
        }
        return carsList;
    }
}

I don't know if this is the best way, but is more secure.

EDIT

I have edited the example, if you want to try it, you could do something like this:

List<Car> carList = Transactor.findAll(); // get all cars
Transactor.delete(myCar);                 // delete an specific car

From here, you should be able to complete your class.

Share:
18,541
Admin
Author by

Admin

Updated on June 04, 2022

Comments

  • Admin
    Admin almost 2 years

    how fix this error and what best way to use sessions in hibernate are one session and multi transactions in all application or what i do is good please check next code

    and i hope you give me answer with correct code and how make it in one session if it best way

    this is error

    Exception in thread "AWT-EventQueue-0" org.hibernate.HibernateException: illegally attempted to associate a proxy with two open Sessions
    at org.hibernate.proxy.AbstractLazyInitializer.setSession(AbstractLazyInitializer.java:112)
    at org.hibernate.engine.internal.StatefulPersistenceContext.reassociateProxy(StatefulPersistenceContext.java:595)
    at org.hibernate.engine.internal.StatefulPersistenceContext.unproxyAndReassociate(StatefulPersistenceContext.java:642)
    at org.hibernate.event.internal.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:90)
    at org.hibernate.event.internal.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:74)
    

    the hibernate transactions and implements

    Session session = HibernateUtil.getSessionFactory().openSession();
    
    Query query = null;
    Transaction transaction = null;
    
    @Override
    public void delete(Car o) {
        transaction = session.beginTransaction();
        session.delete(o);
        transaction.commit();
    
    }
    
    @Override
    public List<Car> findAll() {
        List<Car> carsList = new ArrayList<Car>();
        try {
            query = session.createQuery("from Car");
            carsList = query.list();
            for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
                Car car = (Car) iterator.next();
            }
        } catch (HibernateException he) {
            he.printStackTrace();
        } finally {
    
        }
        return carsList;
    }
    
    @Override
    public Car findById(int id) {
        query = session.createQuery("from Car where id=:id");
        query.setParameter("id", id);
        Car car = (Car) query.list().get(0);
        return car;
    }
    
    @Override
    public void insert(Car o) {
        transaction = session.beginTransaction();
        session.save(o);
        transaction.commit();
    }
    
    @Override
    public void update(Car o) {
        transaction = session.beginTransaction();
        session.update(o);
        transaction.commit();
    }
    
    @Override
    public List<Car> findByCarLicense(CarLicense carLicense) {
        List<Car> carsList = new ArrayList<Car>();
        try {
            query = session.createQuery("from Car where carLicense=:carLicense");
            query.setParameter("carLicense", carLicense);
            carsList = query.list();
            for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
                Car car = (Car) iterator.next();
            }
        } catch (HibernateException he) {
            he.printStackTrace();
        } finally {
    
        }
        return carsList;
    }
    
    @Override
    public List<Car> findByPruCompany(PruCompany pruCompany) {
        List<Car> carsList = new ArrayList<Car>();
        try {
            query = session.createQuery("from Car where pruCompany=:pruCompany");
            query.setParameter("pruCompany", pruCompany);
            carsList = query.list();
            for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
                Car car = (Car) iterator.next();
            }
        } catch (HibernateException he) {
            he.printStackTrace();
        } finally {
    
        }
        return carsList;
    }
    
    @Override
    public List<Car> findByTypy(String type) {
        List<Car> carsList = new ArrayList<Car>();
        try {
            query = session.createQuery("from Car where type=:type");
            query.setParameter("type", type);
            carsList = query.list();
            for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
                Car car = (Car) iterator.next();
            }
        } catch (HibernateException he) {
            he.printStackTrace();
        } finally {
    
        }
        return carsList;
    }
    
    @Override
    public List<Car> findByModel(String model) {
        List<Car> carsList = new ArrayList<Car>();
        try {
            query = session.createQuery("from Car where model=:model");
            query.setParameter("model", model);
            carsList = query.list();
            for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
                Car car = (Car) iterator.next();
            }
        } catch (HibernateException he) {
            he.printStackTrace();
        } finally {
    
        }
        return carsList;
    }
    
    @Override
    public List<Car> findByColor(String color) {
        List<Car> carsList = new ArrayList<Car>();
        try {
            query = session.createQuery("from Car where color=:color");
            query.setParameter("color", color);
            carsList = query.list();
            for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
                Car car = (Car) iterator.next();
            }
        } catch (HibernateException he) {
            he.printStackTrace();
        } finally {
    
        }
        return carsList;
    }
    
    @Override
    public List<Car> findByNumber(String number) {
        List<Car> carsList = new ArrayList<Car>();
        try {
            query = session.createQuery("from Car where number=:number");
            query.setParameter("number", number);
            carsList = query.list();
            for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
                Car car = (Car) iterator.next();
            }
        } catch (HibernateException he) {
            he.printStackTrace();
        } finally {
    
        }
        return carsList;
    }
    
    @Override
    public List<Car> findByKilos(Double kilos) {
        List<Car> carsList = new ArrayList<Car>();
        try {
            query = session.createQuery("from Car where kilos=:kilos");
            query.setParameter("kilos", kilos);
            carsList = query.list();
            for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
                Car car = (Car) iterator.next();
            }
        } catch (HibernateException he) {
            he.printStackTrace();
        } finally {
    
        }
        return carsList;
    }
    
    @Override
    public List<Car> findByAvalibity(String avalibity) {
        List<Car> carsList = new ArrayList<Car>();
        try {
            query = session.createQuery("from Car where avalibity=:avalibity");
            query.setParameter("avalibity", avalibity);
            carsList = query.list();
            for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
                Car car = (Car) iterator.next();
            }
        } catch (HibernateException he) {
            he.printStackTrace();
        } finally {
    
        }
        return carsList;
    }
    
    @Override
    public Car findByChassisNumber(String chassisNumber) {
        query = session.createQuery("from Car where chassisNumber=:chassisNumber");
        query.setParameter("chassisNumber", chassisNumber);
        Car car = (Car) query.list().get(0);
        return car;
    }
    

    and HibernateUtil

    private static final SessionFactory sessionFactory = buildSessionFactory();
    private static SessionFactory buildSessionFactory() {
        try {
            SessionFactory sessionFactory = new Configuration().configure(
                    "/com/core/util/hibernate.cfg.xml").buildSessionFactory();
            return sessionFactory;
        } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    public static void shutdown() {
        getSessionFactory().close();
    }