SpringDataJpa中实现null不更新的解决方案

之前提到过在使用SpringDataJpa中的save()saveAndFlush()方时,会丢失已经存在的值,将已经存在的值更新为null。如果你对这块不是很理解,请看我之前的文章:SpringData JPA save和saveAndFlush的区别。
下面介绍几种解决方式。

一、使用BeanUtils

Spring为我们提供了一个工具类即:BeanUtils。注意不要引错了包。
其中存在一个可以在拷贝时,忽略到null拷贝的方法。
你需要构建一个数组,数组内容为你希望被忽略的属性的名称。
然后先查出需要更新的对象,然后使用方法进行拷贝,再将其存入或更新。
注:这种方法只是不拷贝null值,并不是你将含有属性值为null的对象映射的数据存入就不会覆盖。

public static void copyProperties(Object source, Object target, String... ignoreProperties) throws BeansException {
		copyProperties(source, target, null, ignoreProperties);
	}

二、使用@DynamicUpdate

@DynamicUpdate 与 @DynamicInsert 都是属性值为null的不进行更新或者插入,需要将默认值value置为true(默认为true,但是不同版本可能不一样,这里可以点进源码确认一下)。

三、自己实现反射

实现思路:先查出需要修改的一条数据对应的对象,将新传入的对象与需要修改的对象进行比较。通过反射,将新传入的对象中全部的参数获取出来,然后进行判断,如果新传入的对象的属性与需要修改的对象的属性不为null且与要修改的对象的同一属性值不相等,则进行赋值。

你可能感兴趣的:(JPA)