我在我的一个java应用程序中使用hibernate。数据库在主从层次结构上运行。在其中一个类中,我试图通过首先从主数据库获取整个实体来更新现有实体。然后更新它并将其保存在主数据库中。但由于此调用可能会增加master数据库的负载,因此我希望所有读取仅从slave db发生,并且只在master db上进行更新。我无法读懂奴隶和写入master作为hibernate以某种方式将会话与实体一起保存,并且不允许你更新其他slavesession。
我想出了一个解决方案:
首先,我将实体更改为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 :(得分:0)
您可以使用session.evict(entity)将实体从您加载它的会话中分离出来,然后您就可以在主服务器上更新它。
这种方法的问题在于你无法真正进行交易,你不能确定实体在此期间没有改变。