欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決springboot中@DynamicUpdate注解無(wú)效的問(wèn)題

 更新時(shí)間:2021年07月05日 14:45:43   作者:小渣筆記  
這篇文章主要介紹了解決springboot中@DynamicUpdate注解無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

springboot 中 @DynamicUpdate 注解無(wú)效解決方案

遇到的問(wèn)題

項(xiàng)目中使用 jpa,以前沒(méi)用過(guò),所以踩坑在所難免。

在使用過(guò)程中,要更新一條記錄的某個(gè)字段,更新成功以后,發(fā)現(xiàn)整條記錄只剩下我更新的那個(gè)字段,其他的全部為空了。

瞬間明白,這種更新是全覆蓋,針對(duì)每個(gè)字段 update,實(shí)體類(lèi)沒(méi)賦值的字段,也直接將空值 set 過(guò)去了。

尋求解決方案

這里寫(xiě)圖片描述

正在慶幸這么容易就解決,突然發(fā)現(xiàn)并沒(méi)有這么簡(jiǎn)單。

這里寫(xiě)圖片描述

群眾的力量是無(wú)窮大的,我立刻就明白這個(gè)注解為什么無(wú)效,原來(lái)是搞錯(cuò)了它的用途。

一孔解決方案

如剛才無(wú)數(shù)個(gè)箭頭指向的評(píng)論所說(shuō),用findOne查出原值,然后賦值想要修改的新的字段值。

思路很簡(jiǎn)單,這里主要貼一下對(duì)象復(fù)制的代碼。將數(shù)據(jù)庫(kù)中查出的對(duì)象稱(chēng)為target,包含要修改的字段的對(duì)象稱(chēng)為source,當(dāng)然,最后我們save的是修改之后的target

BeanCopyUtil:

import ch.qos.logback.core.joran.util.beans.BeanUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import java.util.HashSet;
import java.util.Set;
/**
 * created by xxx 2018/7/21
 */
public class BeanCopyUtil {
    //source中的非空屬性復(fù)制到target中
    public static <T> void beanCopy(T source, T target) {
        BeanUtils.copyProperties(source, target, getNullPropertyNames(source));
    }
    //source中的非空屬性復(fù)制到target中,但是忽略指定的屬性,也就是說(shuō)有些屬性是不可修改的(個(gè)人業(yè)務(wù)需要)
    public static <T> void beanCopyWithIngore(T source, T target, String... ignoreProperties) {
        String[] pns = getNullAndIgnorePropertyNames(source, ignoreProperties);
        BeanUtils.copyProperties(source, target, pns);
    }
    public static String[] getNullAndIgnorePropertyNames(Object source, String... ignoreProperties) {
        Set<String> emptyNames = getNullPropertyNameSet(source);
        for (String s : ignoreProperties) {
            emptyNames.add(s);
        }
        String[] result = new String[emptyNames.size()];
        return emptyNames.toArray(result);
    }
    public static String[] getNullPropertyNames(Object source) {
        Set<String> emptyNames = getNullPropertyNameSet(source);
        String[] result = new String[emptyNames.size()];
        return emptyNames.toArray(result);
    }
    public static Set<String> getNullPropertyNameSet(Object source) {
        final BeanWrapper src = new BeanWrapperImpl(source);
        java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
        Set<String> emptyNames = new HashSet<>();
        for (java.beans.PropertyDescriptor pd : pds) {
            Object srcValue = src.getPropertyValue(pd.getName());
            if (srcValue == null) emptyNames.add(pd.getName());
        }
        return emptyNames;
    }
}

有了這個(gè)方法,在修改的時(shí)候就比較方便了,我的做法是在實(shí)體類(lèi)中加一個(gè)方法:

    //這里我設(shè)置【任務(wù)編號(hào)】和【創(chuàng)建人】不可修改
    public void copy(Task task) {
        BeanCopyUtil.beanCopyWithIngore(task, this, "taskNum", "createPerson");
    }

然后在service中update方法中調(diào)用:

    @Transactional
    public Task updateTask(Task task) {
        try {
            if (task.getId() == null) {
                return null;
            }
            Task saveTask = taskRepository.findOne(task.getId());
            saveTask.copy(task);
            return taskRepository.saveAndFlush(task);
        } catch (Exception e) {
            throw new CustomException(SERVER_ERROR, e);
        }
    }

總結(jié)

使用 springboot 時(shí)會(huì)遇到非常非常多的注解,這確實(shí)為開(kāi)發(fā)省去了大量的時(shí)間,和很多沒(méi)有意義的體力勞動(dòng)。但是在使用注解的時(shí)候,一定要弄清楚用途和用法 ,不然明明是用錯(cuò)了,你還會(huì)覺(jué)得莫名其妙。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論