java 非法尝试将代理与两个打开的会话相关联

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/31551288/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 18:46:25  来源:igfitidea点击:

illegally attempted to associate a proxy with two open Sessions

javahibernatesessiontransactions

提问by Alex Sifuentes

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

和 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();
}

回答by Alex Sifuentes

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

尽量不要session为所有交易打开您的对象,而是在每次使用它后打开并关闭它,这是您编写的一个最小示例:

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.

从这里,您应该能够完成您的课程。