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