下面我将详细讲解如何实现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技术站