【问题标题】:illegally attempted to associate a proxy with two open Sessions非法尝试将代理与两个打开的会话相关联
【发布时间】:2015-10-11 15:06:17
【问题描述】:

如何修复此错误以及在休眠中使用会话的最佳方法是在所有应用程序中使用一个会话和多个事务,或者我所做的很好,请检查下一个代码

我希望你用正确的代码给我答案,如果最好的话,如何在一个会话中完成它

这是错误

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)

休眠事务和实现

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;
}

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

【问题讨论】:

  • 大多数情况下,您每次执行transaction.commit 时都应该关闭会话...
  • 这是正确的使用transaction.commit 并且我的方式是正确的
  • 我尝试关闭会话仍然有错误
  • 另一件事,是题外话,你想在你所有的for() 中做什么?就我所见,你什么也没做,你为什么不把它们删掉?
  • 如果我删除 'for()' 如何获取对象,请你能以最好的方式写这门课,谢谢

标签: java hibernate session transactions


【解决方案1】:

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

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

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;
}

可能是这样的:

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;
    }
}

我不知道这是否是最好的方式,但更安全。

编辑

我已经编辑了这个例子,如果你想试试,你可以这样做:

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

从这里开始,你应该能够完成你的课程。

【讨论】:

  • ok,但是调用delete方法DAOFactory.getInstance().getCarLicenseDAOImpl().delete( CRSevice.getInstance().getCarLicenseSrv().getCarLicense());时出现异常@
  • 有什么异常?
  • Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 请你用最好的方式写这门课并优化它以了解我在休眠中的新鲜感,谢谢你这么多
  • 我已经编辑过了,我无法完成你所有的课程,但也许这对你有帮助。
  • 当调用这个方法`@Override public List findAll() { session = HibernateUtil.getSessionFactory().openSession();列表 carsList = new ArrayList();试试 { car​​sList = session.createQuery("from Car").list(); } catch (HibernateException he) { he.printStackTrace(); } 最后 { if(session.isOpen()){ session.close(); } } 返回汽车列表; }` 我想要一个会话到我的应用程序中的所有应用程序我设置临时数据以便以后使用它
猜你喜欢
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
相关资源
最近更新 更多