spring jpa在更新的时候将属性值为空null也更新,刚开始遇到的时候是一脸懵逼啊,心理想spring jpa为什么这个功能都没有了,然后在后面我一个朋友跟我说,他说null 值 spring 不知道你是想把字段置为 null,还是你不想。所以他没有给你处理.
jpa 内部是 merge 实现的更新。所以,没有更改的字段是不会更新的.
代码处理部分:
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import java.beans.PropertyDescriptor;
import java.util.HashSet;
import java.util.Set;
/**
* 作用:用来实体对象中的null赋值
* 名称:UpdateUtil
* 时间:2017-9-28
* 作者:Administrator
*/
public class UpdateUtil {
/**
* 将空值的属性从目标实体类中复制到源实体类中
* @param src : 要将属性中的空值覆盖的对象(源实体类)
* @param target :从数据库根据id查询出来的目标对象
*/
public static void copyNonNullProperties(Object src,Object target){
BeanUtils.copyProperties(src,target,getNullProperties(src));
}
/**
* 将为空的properties给找出来,然后返回出来
* @param src
* @return
*/
private static String[] getNullProperties(Object src){
BeanWrapper srcBean=new BeanWrapperImpl(src);
PropertyDescriptor[] pds=srcBean.getPropertyDescriptors();
Set<String> emptyName=new HashSet<>();
for(PropertyDescriptor p:pds){
Object srcValue=srcBean.getPropertyValue(p.getName());
if(srcValue==null) emptyName.add(p.getName());
}
String[] result=new String[emptyName.size()];
return emptyName.toArray(result);
}
}
在controller中
@PostMapping("/updateBanner")
public ReturnMsg updateBanner(Banner banner){
Banner targetBanner=bannerImpl.findBannerById(banner.getBannerId());
UpdateUtil.copyNonNullProperties(banner,targetBanner);
if(bannerImpl.saveBanner(banner)!=null){
return ReturnMsgUtil.getSuccess();
}
return ReturnMsgUtil.getFailMsg();
}
这是我感觉比较方便的处理方法,后面再思考一下能不能统一处理一下,然后再在这里简化一下
emmmmm….,记录一下!