当前位置: 首页 > 面试题库 >

Hibernate将对象保存到多个会话

司知
2023-03-14
问题内容

我正在尝试使用hibernate模式写入多个数据库。我已经将写和读/写会话封装在单个会话对象中。但是,当我去保存时,出现很多错误,这些对象已与另一个会话关联:“非法尝试将一个集合与两个打开的会话关联”

这是我的代码:

public class MultiSessionObject implements Session {

       private Session writeOnlySession;
       private Session readWriteSession;

       @Override
       public void saveOrUpdate(Object arg0) throws HibernateException {
              readWriteSession.saveOrUpdate(arg0);
              writeOnlySession.saveOrUpdate(arg0);
       }
}

我试图逐出该物体并冲洗;但是,这会导致“行被另一个事务更新或删除”问题,即使两个会话都指向不同的数据库。

public class MultiSessionObject implements Session {

       private Session writeOnlySession;
       private Session readWriteSession;

       @Override
       public void saveOrUpdate(Object arg0) throws HibernateException {
              readWriteSession.saveOrUpdate(arg0);
              readWriteSession.flush();
              readWriteSession.evict(arg0);

              writeOnlySession.saveOrUpdate(arg0);
              writeOnlySession.flush();
              writeOnlySession.evict(arg0);
       }
}

除了上述内容,我还尝试使用hibernate的复制功能。没有错误也是不成功的。

是否有人成功将对象保存到具有相同架构的两个数据库中?


问题答案:

saveOrUpdate尝试重新连接一个给定的实体运行会话的电流,所以代理(懒惰协会)绑定到Hibernate的Session。尝试使用merge而不是saveOrUpdate,因为merge只需将分离的实体状态复制到新检索的受管实体。这样,提供的参数永远不会附加到会话。

另一个问题是事务管理。如果使用线程绑定事务,则要从同一线程更新两个数据源,则需要两个显式事务。

也尝试显式设置事务边界:

public class MultiSessionObject implements Session {

   private Session writeOnlySession;
   private Session readWriteSession;

   @Override
   public void saveOrUpdate(Object arg0) throws HibernateException {

        Transaction readWriteSessionTx = null;
        try {
            readWriteSessionTx = readWriteSession.beginTransaction();
            readWriteSession.merge(arg0);
            readWriteSessionTx.commit();
        } catch (RuntimeException e) {
            if ( readWriteSessionTx != null && readWriteSessionTx.isActive() ) 
                readWriteSessionTx.rollback();
            throw e;
        }

        Transaction writeOnlySessionTx = null;
        try {
            writeOnlySessionTx = writeOnlySession.beginTransaction();
            writeOnlySession.merge(arg0);
            writeOnlySessionTx.commit();
        } catch (RuntimeException e) {
            if ( writeOnlySessionTx != null && writeOnlySessionTx.isActive() ) 
                writeOnlySessionTx.rollback();
            throw e;
        }
   }
}


 类似资料:
  • 我在保存具有ManyToOne双向关系的实体时遇到问题,如下所示: 警告:HHH000437:试图保存一个或多个与未保存的瞬态实体具有不可为空的关联的实体。在保存这些从属实体之前,必须在操作中保存未保存的瞬态实体。未保存的临时实体:([com . epam . apartments booking . model . city # 912])依赖实体:([[com . epam . apartme

  • 我对java swing很陌生,但我正在创建一个库存管理程序,我现在有我的窗口注册表,用户可以插入、姓名、地址、用户名、密码等,并且我在下面有一个按钮来保存所有数据。我希望能够按下保存按钮,将所有数据保存到一个新的userObject,我的问题是如何关联每个文本字段数据,以便将它们保存到保存按钮中的新对象。有人能给我一些关于如何做到这一点的建议吗? 谢谢 我以这种方式尝试了代码: private

  • 问题内容: 我已经创建了一个JSON文件,并且需要能够通过电子邮件与其他协作者共享该文件。但是,尽管在R工作区中有许多处理JSON对象的主题,但实际上没有资源讨论如何实际将JSON对象导出到.JSON文件。 这是一个简单的例子: 最后一行,尝试读取JSON文件,导致错误:“ fromJSON(file =“ export.JSON”)中的错误:意外字符’R’” 显然,save()函数并不是可行的方

  • 错误: 2021-10-13 12:25:27.092ERROR 21016---[nio-8080-exec-3]o. a. c. c. C.[.[.[ /].[调度Servlet]: Servlet.service()用于servlet[调度Servlet]在路径[]抛出异常[处理程序调度失败;嵌套异常java.lang.StackOverflow Error],具有根本原因 堆栈跟踪(多次重

  • 目前,我有一个节点应用程序,它使用mongoose将对象保存到MongoDB中。我使用的是类似于这样的模型: 它将我的对象保存到名为Registrations的集合中。 我将我的注册保存为: 我还希望在创建该对象时将其保存到另一个具有不同名称的集合中,如registrations_new或类似的内容。我想将此条目复制到新集合中。我尝试在连接字符串中添加另一个集合,这完全破坏了mongo部分,我尝试