2017-06-16 95 views
0

我在我的一个java应用程序中使用hibernate。数据库在主从层次结构上运行。在其中一个类中,我尝试更新现有实体,方法是首先从主db db中获取整个实体,然后将其更新并将其保存在主数据库中。但是由于这个调用可以增加master数据库的负载,我希望所有的读取操作只能从slave数据库发生,并且只能在master数据库上更新。我不能从奴隶读取&写给主人,因为hibernate以某种方式将会话与实体保存在一起,并且不允许您在某些其他奴隶会中更新。休眠会话更新问题

我想出了一个解决方案:

首先,我会变成JSON &实体然后阅读JSON形成,希望这将解决问题的会议一个新的实体。以下是代码:

private UserEntity getUserEntityForUpdate(UserData userData) { 
     UserEntity userEntity = (userEntity) sessionFactory.getCurrentSession().byId(userEntity.class).load(user.getId()); 
     ObjectMapper mapper = new ObjectMapper(); 
     String user1 = null; 
     try { 
      user1 = mapper.writeValueAsString(userEntity); 
     } catch (JsonProcessingException e) { 
      e.printStackTrace(); 
     } 
     userEntity obj = new UserEntity(); 
     try { 
      obj = mapper.readValue(user1, userEntity.class); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     if (obj.getId() != null) { 
      userEntity.setId(user.getId()); 
     } 
     obj.setEnabledBy(user.getEnabledBy() != null ? user.getEnabledBy() : ""); 
     obj.setEnabledAt(user.getEnabledAt()); 
     return obj; 
    } 

只是想知道这是一个好方法还是我可以采取任何更好的方法?

+0

快速搜索提出了[this](https://stackoverflow.com/questions/4386130/how-to-setup-hibernate-to-read-write-to-different-datasources),可能会给你其他设计想法。 – Mustafa

回答

0

您可以使用session.evict(实体)从已加载它的会话中分离实体,然后您应该能够在主服务器上进行更新。

这种方法的问题是你不能真正地进行交易,你不能确定实体在此期间没有改变。