java代码用目标对象替换源对象的值(针对相同对象之间的替换)

java代码⽤⽬标对象替换源对象的值(针对相同对象之间的替
换)
前⾔:今天测试提了⼀个优化,在表单提交审批的时候验证⼀下表单正确性,在不符合条件的情况下alert出来,并不需要刷新页⾯(原先因为是从产品上改的项⽬,存在问题颇多,这个页⾯alert之后会刷新⼀遍),⼀看是这样的问题,我回他分分钟搞定。
。。。。。。
现在我的脸已经被打得很肿了,在我把刷新的js代码去掉之后,点击提交审批,弹出验证,关闭验证,页⾯没有刷新,“不错,不错,完美”,内⼼⽐了个(⾦⼥⼠?先⽣?)的⼿势,并顺⼿⼜点了⼀下提交,“嗯?”验证信息没有弹出来。。。emmmmm。。。可能是没点上,⼜点了⼀遍,还是没有。。。好吧,debug吧。
然后开始了排查⼯作,F6⼀步⼀步摁着看,发现在保存表单信息的时候,第⼀次点击提交按钮不报错,第⼆次这会报
hibernate4.HibernateOptimisticLockingFailureException
这样的错,没遇到过,看信息应该是hibernate的问题,只能问度娘了。
百度的结果⼤体上是这三种:
家用水果榨汁机1、由于主键设置为⾃增长,在我们插⼊记录的时候设置了Id的值,Hibernate的映射配置⽂件中,把id 的class改为assigned类型。
2、使⽤了hibernate的saveOrUpdata⽅法进⾏保存实例,saveOrUpdate要求:只有Id为null才能执⾏save,其他情况下执⾏update,在保存实例的时候是新增,但如果id不为null,所有的执⾏都是update操作,可是数据库没有主键对应的值,所以出现了异常,解决办法:unsaved-value="null"是否设置
3、在Hibernate映射⼀对多,多对⼀,多对多的时候新增常常会出现异常
java代码:下⾯的beanutils是apache包下的
public void saveFunctionCell(FunctionCell functionCell,Integer pid)(
System.out.print("现在进⾏新增操作");
FunctionCell fc = new FunctionCell();
try{
fc.setFunCellID(null);
functionCellDao.saveFunctionCell(fc);
}catch(Exception e){
e.printStackTrace();
}
}
关键是beanutils的⽤法
注意特别标识出来的这个地⽅,BeanUtils拷贝Bean属性的时候,它会将你的Integer类型全部设置为0,在这⾥设置⼀个空null,这样就不会抛出错误了。
结论:结合上⾯这些可能性进⾏尝试,发现在id为null的情况下保存没有问题,可能的原因就是在执⾏保存的时候,前⼀次的保存事物影响了下⾯⼀次的保存,需要在id不为空的情况下重新new⼀个对象
进⾏保存。
解决办法:
预测地震的方法⼀看我需要保存的这个对象,⼀下⼦懵逼了,⼤致数数有100多个属性,这样⼀个⼀个的set值到什么时候,这时候就需要我们⽤⽬标对象替换源对象的值,直接把Object的值全部放到新new的Object中。
* ⽐较⽤⽬标对象替换源对象的值
* @param source 源对象
汽车膨胀水箱* @param target ⽬标对象
* @return      最新源对象
* @see
*/
public static Object getObjectByCompareWith(Object source, Object target) {
Class<?> srcClass = Class();
Field[] fields = DeclaredFields();
for (Field field : fields) {
String nameKey = Name();
//获取源对象中的属性值
String srcValue = getClassValue(source, nameKey) == null ? "" : getClassValue(source, nameKey).toString();            //获取⽬标对象中的属性值
String tarValue = getClassValue(target, nameKey) == null ? "" : getClassValue(target, nameKey).toString();            //⽐较两个属性值,不相等的时候进⾏赋值
if (!srcValue.equals(tarValue)) {
source  = setClassValue(source, nameKey, tarValue);
}
}
return source;
}
/**
* 根据字段名称取值
* @param obj 指定对象
* @param fieldName 字段名称
* @return 指定对象
*/
public static Object getClassValue(Object obj, String fieldName) {
if (obj == null) {
return null;
}
Class beanClass = Class();
Method[] ms = Methods();
for (int i = 0; i < ms.length; i++ ) {
// ⾮get⽅法不取
if (!ms[i].getName().startsWith("get")) {
continue;
}
Object objValue = null;
try {
objValue = ms[i].invoke(obj, new Object[] {});
} catch (Exception e) {
continue;
}
if (objValue == null) {
continue;
}
if (ms[i].getName().toUpperCase().UpperCase())
|| ms[i].getName().substring(3).toUpperCase().UpperCase())) {
return objValue;
}
}
return null;
}
* 给对象的字段赋指定的值
* @param obj      指定对象塑料管电晕处理机
* @param fieldName 属性
* @param value    值
* @return
* @see
*/
public static Object setClassValue(Object obj, String fieldName, Object value) {
if (obj == null) {
return null;
}
if(Constant.STRING_NULL.equals(value)) {
value = null;
}
Class beanClass = Class();
Method[] ms = Methods();
for (int i = 0; i < ms.length; i++) {
try {
if (ms[i].getName().startsWith("set")) {
if(ms[i].getName().toUpperCase().UpperCase())
|| ms[i].getName().substring(3).toUpperCase().UpperCase())) {                      String pt = ms[i].getParameterTypes()[0].toString();
if(value != null) {
ms[i].invoke(obj, String(), pt.substring(pt.lastIndexOf(".")+1)));                      } else {
ms[i].invoke(obj, new Object[]{null});
}
break;
}
}
} catch (Exception e) {
continue;
}
}
return obj;
}
手势控制
* 根据属性类型赋值
* @param value      值
* @param paramsType 属性类型
* @return
* @see
*/
public static Object transVal(String value, String paramsType) {
if(String().equals(paramsType)) {
return new String(value);
}
if(String().equals(paramsType)) {
return Double.parseDouble(value);
}
if(String().equals(paramsType)) {
return Integer.parseInt(value);
}
if(String().equals(paramsType)) {
return Long.parseLong(value);
}
if(String().equals(paramsType)) {
return new BigDecimal(value);
}
return value;
}
utils;
/**
* <;简述> 定义类型枚举
* <;详细描述>
* @author  xxx
* @version  $Id$
* @since
* @see
北斗信号源*/
public enum ColumnType {
String, Double, Integer, Long, BigDecimal;
}
直接调⽤⽅法
xxxNew = (ObjectByCompareWith(xxxNew, xxx);即可把源对象的值替换成⽬标对象的值。
这样再提交保存该表单,完美执⾏,每次点击都能出现验证信息。finish

本文发布于:2024-09-23 10:26:33,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/206362.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:保存   时候   对象   验证   没有   问题   表单   提交
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议