一、问题描述
对于hibernate,从数据库查询出数据的时候,如果涉及到数据的单位转换等,需要对于数据重新设置(setValue场景)的操作,目的是为了传递到页面进行zhan展示。
但是你会发现你传递到页面之后,数据库的数据变成0了。
二、代码分析
(1)原本的代码
public String listAll(){
try{
String condition = dealContent();
int total = comResPoolService.getNumAll(condition);
doPage(total);
List<Object[]> comResList = comResPoolService.listAll(condition,
(Integer)dataMap.get("pagesize"), (Integer)dataMap.get("nowpage"));
List<CompanyResPool> newComResList = new ArrayList<CompanyResPool>();
List<CompanyResPool> tempList = new ArrayList<CompanyResPool>();
for(int i=0;i< comResList.size();i++){
CompanyResPool com=new CompanyResPool();
Node node=new Node();
CompanyEntity company=new CompanyEntity();
company=companyService.getById((int)comResList.get(i)[0]);
node=nodeService.getById((int)comResList.get(i)[1]);
com.setCompany(company);
com.setNode(node);
String cpuStr=(Long)comResList.get(i)[2]+"";
String memStr=(Long)comResList.get(i)[3]+"";
String commonStr=(Long)comResList.get(i)[4]+"";
String bandwidthStr=(Long)comResList.get(i)[5]+"";
String ipnumStr=(Long)comResList.get(i)[6]+"";
String ssdStr=(Long)comResList.get(i)[7]+"";
String highStr=(Long)comResList.get(i)[8]+"";
com.setCpu(Integer.parseInt(cpuStr));
com.setMemory(Integer.parseInt(memStr));
com.setCommonDisk(Integer.parseInt(commonStr));
com.setBandwidth(Integer.parseInt(bandwidthStr));
com.setIpNum(Integer.parseInt(ipnumStr));
com.setSsdDisk(Integer.parseInt(ssdStr));
com.setHighDisk(Integer.parseInt(highStr));
tempList.add(com);
}
Date nowTime = new Date();
// 存库的时候,将内存和硬盘大小 ,GB转KB
for (CompanyResPool comRes : tempList) {
Double dataSize = comRes.getDataSize();
CompanyResPool comResPool = new CompanyResPool();
try {
BeanUtils.copyProperties(comResPool, comRes);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
if(dataSize==null){
comResPool.setDataSize(0.0);
}else{
comResPool.setDataSize(Double.valueOf(decf.format(dataSize / GB2KB)));
}
int companyId = comRes.getCompany().getCompanyId();
Map<String,Object> others = new HashMap<String, Object>();
//根据公司id去查询该公司下的VM、SLB、VPC、VPN、BLOCK、OOS资源池,汇总到others下
//1.VM资源池
List<CompanyResPool> vmList=comResPoolService.listVMAndService(companyId, comRes.getNode().getNode_id(), "VM");
others.put("vmList", vmList);
for(CompanyResPool vm:vmList){
vm.setMemory(vm.getMemory() / GB2KB);
vm.setCommonDisk(vm.getCommonDisk()/ GB2KB);
vm.setHighDisk(vm.getHighDisk()/ GB2KB);
vm.setSsdDisk(vm.getSsdDisk()/ GB2KB);
}
//2.服务资源
List<CompanyResPool> slbList=comResPoolService.listVMAndService(companyId, comRes.getNode().getNode_id(), "SLB");
List<CompanyResPool> vpcList=comResPoolService.listVMAndService(companyId, comRes.getNode().getNode_id(), "VPC");
List<CompanyResPool> vpnList=comResPoolService.listVMAndService(companyId, comRes.getNode().getNode_id(), "VPN");
others.put("slbList", slbList);
others.put("vpcList", vpcList);
others.put("vpnList", vpnList);
for(CompanyResPool vm:slbList){
vm.setMemory(vm.getMemory() / GB2KB);
vm.setCommonDisk(vm.getCommonDisk()/ GB2KB);
vm.setHighDisk(vm.getHighDisk()/ GB2KB);
vm.setSsdDisk(vm.getSsdDisk()/ GB2KB);
}
for(CompanyResPool vm:vpcList){
vm.setMemory(vm.getMemory() / GB2KB);
vm.setCommonDisk(vm.getCommonDisk()/ GB2KB);
vm.setHighDisk(vm.getHighDisk()/ GB2KB);
vm.setSsdDisk(vm.getSsdDisk()/ GB2KB);
}
for(CompanyResPool vm:vpnList){
vm.setMemory(vm.getMemory() / GB2KB);
vm.setCommonDisk(vm.getCommonDisk()/ GB2KB);
vm.setHighDisk(vm.getHighDisk()/ GB2KB);
vm.setSsdDisk(vm.getSsdDisk()/ GB2KB);
}
//3.block
List<CompanyBSResource> blockList=comBsResService.list(companyId,comRes.getNode().getNode_id());
others.put("blockList", blockList);
//4.oss
List<ComOsRes> ossList=comOsResService.list(companyId, comRes.getNode().getNode_id());
others.put("ossList", ossList);
//5.common、ssd磁盘数据特殊处理:
long memory = comRes.getMemory();
long commonDisk = comRes.getCommonDisk();
long highDisk = comRes.getHighDisk();
long ssdDisk = comRes.getSsdDisk();
for(CompanyBSResource bs:blockList){
bs.setBs_self_sataDisk(bs.getBs_self_sataDisk()/GB2KB);
bs.setBs_share_ssdDisk(bs.getBs_self_ssdDisk()/GB2KB);
bs.setBs_share_ssdDisk(bs.getBs_share_ssdDisk()/GB2KB);
commonDisk+=bs.getBs_self_sataDisk();
ssdDisk+=bs.getBs_self_ssdDisk();
ssdDisk+=bs.getBs_share_ssdDisk();
}
for(ComOsRes os:ossList){
commonDisk+=os.getLowFreqSize();
ssdDisk+=os.getStandardSize();
}
comResPool.setOthers(others);
newComResList.add(comResPool);
}
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(java.util.Date.class,
new JsonDateValueProcessor("yyyy-MM-dd HH:mm:ss"));
jsonConfig.setExcludes(new String[]{"node_capacity"});
generateSuccessListResponse(JSONArray.fromObject(newComResList,jsonConfig));
}catch(Exception e){
e.printStackTrace();
generateFailResponse(e.getMessage());
}
return JSON;
}
原因:
在hebinate查询出数据之后,若对于该类进行了数值上的转换和设置,herbinate会自动将转换的值,重新保存到数据库中。这就是查询转换之后,值会为0的问题的由来:有一些没有被转换的值,初始化默认为0,所以保存的时候就是0
(2)修改后的代码
public String listAll(){
try{
String condition = dealContent();
int total = comResPoolService.getNumAll(condition);
doPage(total);
List<Object[]> comResList = comResPoolService.listAll(condition,
(Integer)dataMap.get("pagesize"), (Integer)dataMap.get("nowpage"));
List<CompanyResPool> newComResList = new ArrayList<CompanyResPool>();
List<CompanyResPool> tempList = new ArrayList<CompanyResPool>();
for(int i=0;i< comResList.size();i++){
CompanyResPool com=new CompanyResPool();
Node node=new Node();
CompanyEntity company=new CompanyEntity();
company=companyService.getById((int)comResList.get(i)[0]);
node=nodeService.getById((int)comResList.get(i)[1]);
com.setCompany(company);
com.setNode(node);
String cpuStr=(Long)comResList.get(i)[2]+"";
String memStr=(Long)comResList.get(i)[3]+"";
String commonStr=(Long)comResList.get(i)[4]+"";
String bandwidthStr=(Long)comResList.get(i)[5]+"";
String ipnumStr=(Long)comResList.get(i)[6]+"";
String ssdStr=(Long)comResList.get(i)[7]+"";
String highStr=(Long)comResList.get(i)[8]+"";
com.setCpu(Integer.parseInt(cpuStr));
com.setMemory(Long.parseLong(memStr));
com.setCommonDisk(Long.parseLong(commonStr));
com.setBandwidth(Integer.parseInt(bandwidthStr));
com.setIpNum(Integer.parseInt(ipnumStr));
com.setSsdDisk(Long.parseLong(ssdStr));
com.setHighDisk(Long.parseLong(highStr));
tempList.add(com);
}
// 存库的时候,将内存和硬盘大小 ,GB转KB
for (CompanyResPool comRes : tempList) {
Double dataSize = comRes.getDataSize();
CompanyResPool comResPool = new CompanyResPool();
try {
BeanUtils.copyProperties(comResPool, comRes);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
if(dataSize==null){
comResPool.setDataSize(0.0);
}else{
comResPool.setDataSize(Double.valueOf(decf.format(dataSize / GB2KB)));
}
int companyId = comRes.getCompany().getCompanyId();
Map<String,Object> others = new HashMap<String, Object>();
//根据公司id去查询该公司下的VM、SLB、VPC、VPN、BLOCK、OOS资源池,汇总到others下
//1.VM资源池
List<CompanyResPool> vmList=comResPoolService.listVMAndService(companyId, comRes.getNode().getNode_id(), "VM");
//2.服务资源
List<CompanyResPool> slbList=comResPoolService.listVMAndService(companyId, comRes.getNode().getNode_id(), "SLB");
List<CompanyResPool> vpcList=comResPoolService.listVMAndService(companyId, comRes.getNode().getNode_id(), "VPC");
List<CompanyResPool> vpnList=comResPoolService.listVMAndService(companyId, comRes.getNode().getNode_id(), "VPN");
//3.block
List<CompanyBSResource> blockList=comBsResService.list(companyId,comRes.getNode().getNode_id());
//4.oss
List<ComOsRes> ossList=comOsResService.list(companyId, comRes.getNode().getNode_id());
List<CompanyResPool> vmData=new ArrayList<CompanyResPool>(vmList.size());
List<CompanyResPool> slbData=new ArrayList<CompanyResPool>(slbList.size());
List<CompanyResPool> vpcData=new ArrayList<CompanyResPool>(vpcList.size());
List<CompanyResPool> vpnData=new ArrayList<CompanyResPool>(vpnList.size());
List<CompanyBSResource> blockData=new ArrayList<CompanyBSResource>(blockList.size());
List<ComOsRes> ossData=new ArrayList<ComOsRes>(ossList.size());
//5.common、ssd磁盘数据特殊处理:
long memory = comRes.getMemory()/GB2KB;
long commonDisk = comRes.getCommonDisk()/GB2KB;
long highDisk = comRes.getHighDisk()/GB2KB;
long ssdDisk = comRes.getSsdDisk()/GB2KB;
for(CompanyResPool vm:vmList){
CompanyResPool comVm=new CompanyResPool();
try {
BeanUtils.copyProperties(comVm, vm);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
comVm.setMemory(vm.getMemory() / GB2KB);
comVm.setCommonDisk(vm.getCommonDisk()/ GB2KB);
comVm.setHighDisk(vm.getHighDisk()/ GB2KB);
comVm.setSsdDisk(vm.getSsdDisk()/ GB2KB);
vmData.add(comVm);
}
for(CompanyResPool vm:slbList){
CompanyResPool comSlb=new CompanyResPool();
try {
BeanUtils.copyProperties(comSlb, vm);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
comSlb.setMemory(vm.getMemory() / GB2KB);
comSlb.setCommonDisk(vm.getCommonDisk()/ GB2KB);
comSlb.setHighDisk(vm.getHighDisk()/ GB2KB);
comSlb.setSsdDisk(vm.getSsdDisk()/ GB2KB);
slbData.add(comSlb);
}
for(CompanyResPool vm:vpcList){
CompanyResPool comVPC=new CompanyResPool();
try {
BeanUtils.copyProperties(comVPC, vm);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
comVPC.setMemory(vm.getMemory() / GB2KB);
comVPC.setCommonDisk(vm.getCommonDisk()/ GB2KB);
comVPC.setHighDisk(vm.getHighDisk()/ GB2KB);
comVPC.setSsdDisk(vm.getSsdDisk()/ GB2KB);
vpcData.add(comVPC);
}
for(CompanyResPool vm:vpnList){
CompanyResPool comVPN=new CompanyResPool();
try {
BeanUtils.copyProperties(comVPN, vm);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
comVPN.setMemory(vm.getMemory() / GB2KB);
comVPN.setCommonDisk(vm.getCommonDisk()/ GB2KB);
comVPN.setHighDisk(vm.getHighDisk()/ GB2KB);
comVPN.setSsdDisk(vm.getSsdDisk()/ GB2KB);
vpnData.add(comVPN);
}
for(CompanyBSResource bs:blockList){
CompanyBSResource comBS=new CompanyBSResource();
try {
BeanUtils.copyProperties(comBS, bs);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
comBS.setBs_self_sataDisk(bs.getBs_self_sataDisk()/GB2KB);
comBS.setBs_self_ssdDisk(bs.getBs_self_ssdDisk()/GB2KB);
comBS.setBs_share_ssdDisk(bs.getBs_share_ssdDisk()/GB2KB);
commonDisk+=comBS.getBs_self_sataDisk();
ssdDisk+=comBS.getBs_self_ssdDisk();
ssdDisk+=comBS.getBs_share_ssdDisk();
blockData.add(comBS);
}
for(ComOsRes os:ossList){
ComOsRes comOS=new ComOsRes();
try {
BeanUtils.copyProperties(comOS, os);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
comOS.setLowFreqSize(os.getLowFreqSize()/GB2KB);
comOS.setStandardSize(os.getStandardSize()/GB2KB);
commonDisk+=comOS.getLowFreqSize();
ssdDisk+=comOS.getStandardSize();
ossData.add(comOS);
}
comResPool.setCommonDisk(commonDisk);
comResPool.setHighDisk(highDisk);
comResPool.setSsdDisk(ssdDisk);
comResPool.setMemory(memory);
others.put("slbList", slbData);
others.put("vpcList", vpcData);
others.put("vpnList", vpnData);
others.put("vmList", vmData);
others.put("blockList", blockData);
others.put("ossList", ossData);
comResPool.setOthers(others);
newComResList.add(comResPool);
}
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(java.util.Date.class,
new JsonDateValueProcessor("yyyy-MM-dd HH:mm:ss"));
jsonConfig.setExcludes(new String[]{"node_capacity"});
generateSuccessListResponse(JSONArray.fromObject(newComResList,jsonConfig));
}catch(Exception e){
e.printStackTrace();
generateFailResponse(e.getMessage());
}
return JSON;
}
三、解决方案
当涉及到任何从hibernate查询出来的实体类的属性修改的时候,qing请使用下面这段代码完成修改:
//4.oss
List<ComOsRes> ossList=comOsResService.list(companyId, comRes.getNode().getNode_id());
for(ComOsRes os:ossList){
ComOsRes comOS=new ComOsRes();
try {
BeanUtils.copyProperties(comOS, os);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
comOS.setLowFreqSize(os.getLowFreqSize()/GB2KB);
comOS.setStandardSize(os.getStandardSize()/GB2KB);
commonDisk+=comOS.getLowFreqSize();
ssdDisk+=comOS.getStandardSize();
ossData.add(comOS);
}
很简单,用BeanUtils.copyProperties(comOS, os);
方法,将这个对象(从数据库中查询出来的)复制到comOS(新建的对象)中。然后对于comOS对象完成数据的设置,返回到页面展示即可。
相当于将原本的实体类复制了一份,你修改的是复制的那个实体类。这样修改成功后,就不会触发hibernate的更新了。