如何使用 CRUD 存储库防止更新操作中的空条目?



考虑以下事件:-

  1. 创建用户 [id=1, 名称=Ram, 城市=德里, email=abc@gmail.com, 电话=12345]
  2. 更新用户 [id=1, 城市=孟买, 电话=56789]

    对于 CREATE 操作,这是存储在数据库中的内容:-

    [id=1, name=Ram, city=Delhi, email=abc@gmail.com, phone=12345]
    

    但是,当我执行 UPDATE 操作时,未更新的字段变为空

    [id=1, name=null, city=Mumbai, email=null, phone=56789]
    

现在,我的问题是如何防止姓名和电子邮件变为空?



这是代码片段:-

  1. 实体类:-

    @Entity
    public class User {
    @Id
    private Integer id;
    private String name;
    private String city;
    private String email;
    private String phone;
    //Setters and Getters 
    }
    
  2. 存储 库:-

    import org.springframework.data.repository.CrudRepository;
    import com.therealdanvega.domain.User;
    public interface UserRepository extends CrudRepository<User, Integer>{
    }
    
  3. 应用类别 :-

    @SpringBootApplication
    public class JsontodbApplication implements CommandLineRunner {
    @Autowired
    private UserRepository userRepo;
    public static void main(String[] args) {
    SpringApplication.run(JsontodbApplication.class, args);
    }
    @Override
    public void run(String... args) throws Exception {
    /* CREATE USER */
    userRepo.save(createUser());
    /* UPDATE USER */
    userRepo.save(updateUser());
    System.out.println(userRepo.findOne(1));
    }
    public User createUser() {
    User user = new User();
    user.setId(1);
    user.setName("Ram");
    user.setCity("Delhi");
    user.setEmail("abc@gmail.com");
    user.setPhone("12345");
    return user;
    }
    public User updateUser() {
    User user = new User();
    user.setId(1);
    user.setCity("Mumbai");
    user.setPhone("56789");
    return user;
    }
    }
    

你的代码不像你想象的那样工作。对于春天来说,它实际上是这样的:

  1. 取新对象id = 1 的用户,名称 = Ram ...并把它放进那个基地。
  2. 取新对象ID= 1 的用户 , 城市 = 孟买 ...并把它放进那个基地。

Spring 存储库的工作方式是这样的,如果您使用 NULL ID 保存对象,它将添加它。如果您使用给定的 id 保存对象,它将更新每个已更改的值。因此,对于 spring,您实际上会更新每个字段,其中一些用于新值,其中大部分用于 NULL。更多信息

您应该获取通过第一个保存函数返回的对象,然后再次更新它。诸如此类:

@SpringBootApplication
public class JsontodbApplication implements CommandLineRunner {
@Autowired
private UserRepository userRepo;
public static void main(String[] args) {
SpringApplication.run(JsontodbApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
/* CREATE USER */
User user = userRepo.save(createUser(new User()));
/* UPDATE USER */
userRepo.save(updateUser(user));
System.out.println(userRepo.findOne(1));
}
public User createUser(User user) {
user.setName("Ram");
user.setCity("Delhi");
user.setEmail("abc@gmail.com");
user.setPhone("12345");
return user;
}
public User updateUser(User user) {
user.setCity("Mumbai");
user.setPhone("56789");
return user;
}
}

最新更新