详解SpringBoot实现JPA的save方法不更新null属性

下面我将详细讲解如何实现SpringBoot的JPA的save方法不更新null属性的方法:

问题描述

使用SpringBoot中JPA进行开发时,对于已经存在的实体对象进行更新操作时,如果实体对象中有一些属性值为null,那么在执行save()方法时,JPA会自动将这些属性更新为null,但是我们有时候并不希望这样,我们希望保留原来已经存在的值,仅仅修改非null的属性值。

解决方法

使用SpringDataJPA的saveAndFlush方法

在默认情况下,SpringDataJPA的save方法会执行merge操作,即合并实体对象的属性值,如果该属性值为null,则会将该属性更新为null,但是SpringDataJPA也提供了saveAndFlush方法,该方法默认会执行一次刷新操作,具体实现可以看下面的代码:

@Transactional
public void updateUser(User user) {
    User oldUser = userRepository.findById(user.getId()).orElseThrow(() -> new ResourceNotFoundException("User", "id", user.getId()));
    oldUser.setUsername(user.getUsername());
    oldUser.setAge(user.getAge());
    userRepository.saveAndFlush(oldUser);
}

如上代码所示,我们直接使用saveAndFlush方法更新对象,saveAndFlush方法会保存对象并刷新到数据库中,这样就可以避免更新null的问题。

使用@JSONIgnoreProperties注解

另一种方法是使用@JSONIgnoreProperties注解,该注解可以忽略实体对象中的指定属性,这样在更新实体对象时,被忽略的属性就不会更新为null了。

@Entity
@Table(name = "user")
@JsonIgnoreProperties(value = {"createTime", "updateTime"}, ignoreUnknown = true)
public class User {
    // ...
}

如上代码所示,在User类中使用@JsonIgnoreProperties注解,指定忽略createTime和updateTime属性。这样在更新实体对象时,这两个属性就不会被更新为null了。

示例

下面提供两个示例帮助理解:

示例一:使用saveAndFlush方法实现不更新null属性

@Transactional
public void updateUser(User user) {
    User oldUser = userRepository.findById(user.getId()).orElseThrow(() -> new ResourceNotFoundException("User", "id", user.getId()));
    oldUser.setUsername(user.getUsername());
    oldUser.setAge(user.getAge());
    userRepository.saveAndFlush(oldUser);
}

在上面的代码中,我们使用SpringDataJPA的saveAndFlush方法来更新User对象,这样就可以避免更新null属性的问题。

示例二:使用@JSONIgnoreProperties注解实现不更新null属性

@Entity
@Table(name = "user")
@JsonIgnoreProperties(value = {"createTime", "updateTime"}, ignoreUnknown = true)
public class User {
    // ...
}

@Transactional
public void updateUser(User user) {
    User oldUser = userRepository.findById(user.getId()).orElseThrow(() -> new ResourceNotFoundException("User", "id", user.getId()));
    oldUser.setUsername(user.getUsername());
    oldUser.setAge(user.getAge());
    userRepository.save(oldUser);
}

在上面的代码中,我们在User类上添加了@JsonIgnoreProperties注解,指定忽略createTime和updateTime属性,在更新User对象时,这两个属性就不会更新为null了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解SpringBoot实现JPA的save方法不更新null属性 - Python技术站

(3)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 微信小程序实现拍照打卡功能

    这里给出一个基于微信小程序的拍照打卡功能的完整攻略。 实现思路 我们需要使用微信小程序自带的组件camera和canvas,将camera拍摄的内容放在一个canvas中,然后执行保存操作。保存完成后,我们可以通过wx.getFileSystemManager()接口获取保存的照片,再将其上传到服务器,最后完成打卡操作。 具体流程如下: 使用wx.getSe…

    Java 2023年5月23日
    00
  • jsp实现购物程序

    在这里我将会为你详细讲解“JSP实现购物程序”的完整攻略。整个攻略包含以下步骤: 数据库设计与创建 创建JavaBean封装商品信息 创建购物车类 编写购物车的相关业务处理代码 编写JSP页面实现购物功能 下面我将会逐一为你详细说明每一步。 1. 数据库设计与创建 首先需要设计并创建一个商品信息的数据库表。一般情况下,商品信息表包含商品ID、名称、价格等基本…

    Java 2023年6月15日
    00
  • Java实战之用hutool-db实现多数据源配置

    当我们的应用需要连接多个数据库时,常规的做法是通过JDBC来手动连接和操作不同的数据源。这样的代码通常会显得冗长和重复,对于代码维护和可读性都造成了一定的负担。事实上,Java中有一些工具库可以帮助我们更容易地实现多数据源配置和自动化操作,比如常用的HikariCP、Druid等数据库连接池,还有hutool-db库。 Hutool-db简介 Hutool-…

    Java 2023年5月20日
    00
  • 基于Java解决华为机试之字符串合并处理实操

    下面是基于Java解决华为机试之字符串合并处理实操的完整攻略。 1. 题目背景 该机试题目要求将两个字符串进行处理,将它们合并成一个字符串并进行排序。在处理过程中,需要满足特殊规则,即将字母和数字分别单独排序。例如,给定以下两个字符串: str1 = "a3cd2e1" str2 = "ghf4" 则处理后的结果应该为…

    Java 2023年5月27日
    00
  • 使用GSON库将Java中的map键值对应结构对象转换为JSON

    使用GSON库可以方便地将Java中的map键值对应结构对象转换为JSON格式的数据。下面为您介绍具体的步骤: 步骤1:引入GSON库 首先需要在项目中集成GSON库,可以通过在build.gradle文件中配置来实现引入该库。 implementation ‘com.google.code.gson:gson:2.8.7’ 步骤2:创建Java对象 在实现…

    Java 2023年5月26日
    00
  • Spring Boot Logging Level设置为off时的Bug

    为了更好的解释“Spring Boot Logging Level设置为off时的Bug”问题以及解决方案,我们需要先了解以下几个问题: 什么是Logging Level Spring Boot默认的Logging Level设置 Logging Level为off时会出现什么问题 如何避免Logging Level为off导致的问题 现在我们按照这个顺序来…

    Java 2023年5月20日
    00
  • 浅析java异常栈

    下面我将为您详细讲解“浅析Java异常栈”的完整攻略。 浅析Java异常栈 异常栈的概述 在Java中,异常是指当前程序不能够继续执行下去的错误或问题。当程序发生异常时,会自动创建一个异常对象,并将这个异常对象抛出给Java虚拟机,Java虚拟机再根据异常对象调用相应的异常处理程序进行处理。 异常栈是异常处理机制的重要组成部分,它是一个由多个异常堆栈组成的数…

    Java 2023年5月27日
    00
  • Java精确抽取网页发布时间

    针对Java精确抽取网页发布时间,下面是完整的攻略,包含以下几个步骤: 1. 获取HTML网页源代码 使用HttpClient或Jsoup等网络库,向目标网页发送请求,获取返回的HTML文本内容。 示例1-使用HttpClient获取HTML网页源代码: import org.apache.http.client.methods.HttpGet; impor…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部