hibernate查询数据,单位转换时数据清0问题解决

一、问题描述

对于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的更新了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值