多线程异常:"Illegal attempt to associate a collection with two open sessions"?

Multithreading Exception : "Illegal attempt to associate a collection with two open sessions"?

所以我试图实现适当的多线程以在休眠中进行保存和更新操作。我的每个线程都使用一个新创建的会话和自己的事务。

我总是收到“非法尝试将一个集合与两个打开的会话相关联”的异常,因为我同时使用多个会话(我还使用共享会话对其进行了测试,但也没有用)。这里的问题是我需要多个会话,这就是我被告知休眠多线程可以工作的方式。

这段代码基本上是“同时”在多个线程上执行的。

            var session = database.openSession();  // sessionFactory.openSession()
            session.beginTransaction();

            try {

                // Save my entities
                for (var identity : identities)
                    session.update(identity);

                session.flush();
                session.clear();
                session.getTransaction().commit();
            } catch (Exception e){
                GameExtension.getInstance().trace("Save");
                GameExtension.getInstance().trace(e.getMessage());
                session.getTransaction().rollback();
            }


            session.close();

那么我该如何解决这个问题呢?我如何保持多个会话并同时防止该异常?

您面临的问题是您使用会话 1 的集合加载实体,然后以某种方式将该对象传递给会话 2,而该对象仍与打开的会话 1 相关联。这根本行不通,即使在单线程环境中。

从会话 1 中分离对象或在会话 2 中重新加载对象。