服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 解决springboot中@DynamicUpdate注解无效的问题

解决springboot中@DynamicUpdate注解无效的问题

2021-09-27 01:07小渣笔记 Java教程

这篇文章主要介绍了解决springboot中@DynamicUpdate注解无效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

springboot 中 @DynamicUpdate 注解无效解决方案

遇到的问题

项目中使用 jpa,以前没用过,所以踩坑在所难免。

在使用过程中,要更新一条记录的某个字段,更新成功以后,发现整条记录只剩下我更新的那个字段,其他的全部为空了。

瞬间明白,这种更新是全覆盖,针对每个字段 update,实体类没赋值的字段,也直接将空值 set 过去了。

寻求解决方案

解决springboot中@DynamicUpdate注解无效的问题

正在庆幸这么容易就解决,突然发现并没有这么简单。

解决springboot中@DynamicUpdate注解无效的问题

群众的力量是无穷大的,我立刻就明白这个注解为什么无效,原来是搞错了它的用途。

一孔解决方案

如刚才无数个箭头指向的评论所说,用findOne查出原值,然后赋值想要修改的新的字段值。

思路很简单,这里主要贴一下对象复制的代码。将数据库中查出的对象称为target,包含要修改的字段的对象称为source,当然,最后我们save的是修改之后的target

BeanCopyUtil:

  1. import ch.qos.logback.core.joran.util.beans.BeanUtil;
  2. import org.springframework.beans.BeanUtils;
  3. import org.springframework.beans.BeanWrapper;
  4. import org.springframework.beans.BeanWrapperImpl;
  5. import java.util.HashSet;
  6. import java.util.Set;
  7. /**
  8. * created by xxx 2018/7/21
  9. */
  10. public class BeanCopyUtil {
  11. //source中的非空属性复制到target中
  12. public static <T> void beanCopy(T source, T target) {
  13. BeanUtils.copyProperties(source, target, getNullPropertyNames(source));
  14. }
  15. //source中的非空属性复制到target中,但是忽略指定的属性,也就是说有些属性是不可修改的(个人业务需要)
  16. public static <T> void beanCopyWithIngore(T source, T target, String... ignoreProperties) {
  17. String[] pns = getNullAndIgnorePropertyNames(source, ignoreProperties);
  18. BeanUtils.copyProperties(source, target, pns);
  19. }
  20. public static String[] getNullAndIgnorePropertyNames(Object source, String... ignoreProperties) {
  21. Set<String> emptyNames = getNullPropertyNameSet(source);
  22. for (String s : ignoreProperties) {
  23. emptyNames.add(s);
  24. }
  25. String[] result = new String[emptyNames.size()];
  26. return emptyNames.toArray(result);
  27. }
  28. public static String[] getNullPropertyNames(Object source) {
  29. Set<String> emptyNames = getNullPropertyNameSet(source);
  30. String[] result = new String[emptyNames.size()];
  31. return emptyNames.toArray(result);
  32. }
  33. public static Set<String> getNullPropertyNameSet(Object source) {
  34. final BeanWrapper src = new BeanWrapperImpl(source);
  35. java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
  36. Set<String> emptyNames = new HashSet<>();
  37. for (java.beans.PropertyDescriptor pd : pds) {
  38. Object srcValue = src.getPropertyValue(pd.getName());
  39. if (srcValue == null) emptyNames.add(pd.getName());
  40. }
  41. return emptyNames;
  42. }
  43. }

有了这个方法,在修改的时候就比较方便了,我的做法是在实体类中加一个方法:

  1. //这里我设置【任务编号】和【创建人】不可修改
  2. public void copy(Task task) {
  3. BeanCopyUtil.beanCopyWithIngore(task, this, "taskNum", "createPerson");
  4. }

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

  1. @Transactional
  2. public Task updateTask(Task task) {
  3. try {
  4. if (task.getId() == null) {
  5. return null;
  6. }
  7. Task saveTask = taskRepository.findOne(task.getId());
  8. saveTask.copy(task);
  9. return taskRepository.saveAndFlush(task);
  10. } catch (Exception e) {
  11. throw new CustomException(SERVER_ERROR, e);
  12. }
  13. }

总结

使用 springboot 时会遇到非常非常多的注解,这确实为开发省去了大量的时间,和很多没有意义的体力劳动。但是在使用注解的时候,一定要弄清楚用途和用法 ,不然明明是用错了,你还会觉得莫名其妙。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

原文链接:https://blog.csdn.net/m0_37659871/article/details/81143199

延伸 · 阅读

精彩推荐
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7472021-02-04
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17