【问题标题】:How to prevent NULL entry in UPDATE operation using CRUD Repository?如何使用 CRUD 存储库防止 UPDATE 操作中的 NULL 条目?
【发布时间】:2019-03-25 08:37:21
【问题描述】:

考虑以下事件:-

  1. 创建用户 [id=1, name=Ram, city=Delhi, email=abc@gmail.com, phone=12345]
  2. 更新用户 [id=1, city=Mumbai, phone=56789]

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

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

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

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

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



这里是代码 sn-p :-

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

【问题讨论】:

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


    【解决方案1】:

    您的代码不像您想象的那样工作。对于 Spring,它实际上是这样的:

    1. 使用 id = 1 ,name = Ram ... 的新对象 User 将其放入该基础。
    2. 将新对象 User id = 1 , city = Mumbai ... 放入该基础。

    Spring Repository 就是这样工作的,如果你用 NULL id 保存对象,它会添加它。如果您使用给定的 id 保存对象,它将更新每个已更改的值。因此,对于 spring,您实际上会更新每个字段,其中一些用于新值,而大多数用于 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;
    }
    }
    

    【讨论】:

    • 正如我所说,要进行第二次操作,请使用第一个中的对象!我将编辑代码
    猜你喜欢
    • 1970-01-01
    • 2018-06-14
    • 2019-12-22
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多