如何防止使用CRUD存储库在UPDATE操作中输入NULL?

时间:2018-10-20 19:48:52

标签: spring hibernate spring-boot spring-data-jpa

请考虑以下事件:-

  1. 创建用户[id = 1,名称= Ram,城市=德里,电子邮件= 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]
    
  

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



这是代码段:-

  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 个答案:

答案 0 :(得分:1)

您的代码无法正常运行。对于Spring,实际上是这样的:

  1. 使用id = 1,name = Ram ...的新对象 User 并将其放入该数据库。
  2. 使用id = 1,city = Mumbai的新对象 User 并将其放入该数据库。

Spring Repository的工作原理是这样的,如果您使用NULL ID保存对象,它将添加它。如果您保存具有给定id的对象,它将更新所有已更改的值。因此,在春季,您实际上更新了每个字段,其中一些字段用于新值,而大多数字段用于NULL。 MORE INFO

您应该获取要通过第一个保存函数返回的对象,然后再次对其进行更新。像这样:

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