使用CRUD存储库的并行处理中的CREATE和UPDATE操作

时间:2018-10-21 08:45:35

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

我正在设计一个应用程序,该应用程序从上游系统接收两个事件,即 CREATE UPDATE 。现在,请考虑以下事件:-

 1. CREATE User [id=1, name=Ram, city=Delhi, email=abc@gmail.com, phone=12345]
 2. UPDATE User [id=1, city=Mumbai, phone=56789]

由于应用程序涉及并行处理,因此无法保证事件的顺序,因此UPDATE事件可能早于CREATE事件。

如果先执行UPDATE操作,然后执行CREATE操作

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

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

但是,当我执行CREATE操作时,更新的字段将替换为旧值,这就是存储在数据库中的内容

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

但是我只希望在执行 CREATE操作时,在第一个 UPDATE操作之后插入 null 值。但是 CREATE操作会覆盖已更新的字段,因此更新会丢失。因此,基本上,这就是我期望在 UPDATE INSERT操作之后得到的输出:-

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

  

我的问题是我该如何实现?

     

注意:我正在使用 CRUD存储库,并且更喜欢仅将CRUD存储库用于数据库操作的解决方案。



这是代码段:-

  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 {
    
            /* UPDATE USER */
            User user = userRepo.save(updateUser(new User()));
            System.out.println(userRepo.findOne(1));  //[id=1, name=null, city=Mumbai, email=null, phone=56789]
    
            /* CREATE USER */
            userRepo.save(updateUser(user));
            System.out.println(userRepo.findOne(1)); //[id=1, name=Ram, city=Delhi, email=abc@gmail.com, phone=12345]
    
        }
    
        public User createUser(User 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) {
            user.setId(1);
            user.setCity("Mumbai");
            user.setPhone("56789");
            return user;
            }
        }
    

1 个答案:

答案 0 :(得分:0)

从Java 8开始,就可以向接口添加默认方法。您可以向UserRepository添加默认方法,例如:

default <S extends User> S safeSave(S entity) {
    // your checks and entity manipulation, like:
    // check if exists already and fill fields accordingly
    // finally save the correct data
    return save(entity);
}