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

解決springboot中@DynamicUpdate注解無效的問題

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

springboot 中 @DynamicUpdate 注解無效解決方案

遇到的問題

項目中使用 jpa,以前沒用過,所以踩坑在所難免。

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

瞬間明白,這種更新是全覆蓋,針對每個字段 update,實體類沒賦值的字段,也直接將空值 set 過去了。

尋求解決方案

這里寫圖片描述

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

這里寫圖片描述

群眾的力量是無窮大的,我立刻就明白這個注解為什么無效,原來是搞錯了它的用途。

一孔解決方案

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

思路很簡單,這里主要貼一下對象復制的代碼。將數(shù)據庫中查出的對象稱為target,包含要修改的字段的對象稱為source,當然,最后我們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中的非空屬性復制到target中
    public static <T> void beanCopy(T source, T target) {
        BeanUtils.copyProperties(source, target, getNullPropertyNames(source));
    }
    //source中的非空屬性復制到target中,但是忽略指定的屬性,也就是說有些屬性是不可修改的(個人業(yè)務需要)
    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;
    }
}

有了這個方法,在修改的時候就比較方便了,我的做法是在實體類中加一個方法:

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

然后在service中update方法中調用:

    @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);
        }
    }

總結

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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java:泛型知識知多少

    Java:泛型知識知多少

    這篇文章主要介紹了java泛型基礎知識及通用方法,從以下幾個方面介紹一下java的泛型: 基礎, 泛型關鍵字, 泛型方法, 泛型類和接口,感興趣的可以了解一下
    2021-08-08
  • SpringBoot項目中接口防刷的完整代碼

    SpringBoot項目中接口防刷的完整代碼

    本文通過實例代碼給大家介紹了SpringBoot項目中接口防刷的方法,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-07-07
  • log4j詳細的常用配置說明介紹

    log4j詳細的常用配置說明介紹

    下面看我怎么一步步配置到控制臺的,log4j的輸出級別和輸出模式相信都知道的
    2012-11-11
  • 源碼解析Java類加載器

    源碼解析Java類加載器

    這篇文章主要給大家介紹了Java類加載器源碼解析的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • java Swing實現(xiàn)五子棋游戲

    java Swing實現(xiàn)五子棋游戲

    這篇文章主要為大家詳細介紹了java Swing實現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Java concurrency線程池之線程池原理(三)_動力節(jié)點Java學院整理

    Java concurrency線程池之線程池原理(三)_動力節(jié)點Java學院整理

    這篇文章主要為大家詳細介紹了Java concurrency線程池之線程池原理第三篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • IDEA實現(xiàn)遠程調試步驟詳解

    IDEA實現(xiàn)遠程調試步驟詳解

    這篇文章主要介紹了IDEA實現(xiàn)遠程調試步驟詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Java 中的io模型詳解

    Java 中的io模型詳解

    這篇文章主要介紹了Java 中io模型的相關資料,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-04-04
  • java去除集合中重復元素示例分享 java去除重復

    java去除集合中重復元素示例分享 java去除重復

    這篇文章主要介紹了java去除集合中重復元素示例,大家參考使用吧
    2014-01-01
  • 關于Spring自定義XML schema 擴展的問題(Spring面試高頻題)

    關于Spring自定義XML schema 擴展的問題(Spring面試高頻題)

    今天給大家分享一道spring高頻率面試題關于Spring自定義XML schema 擴展的問題,今天以spring整合dubbo的實例給大家詳細講解下,感興趣的朋友跟隨小編一起看看吧
    2021-05-05

最新評論