【问题标题】:CREATE and UPDATE operations in parallel processing using CRUD Repository使用 CRUD 存储库进行并行处理的 CREATE 和 UPDATE 操作
【发布时间】:2018-10-21 08:45:34
【问题描述】:

我正在设计一个应用程序,我从上游系统获取两个事件,即 CREATEUPDATE。现在,考虑以下事件:-

 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 操作 会覆盖更新的字段,因此更新会丢失。所以基本上,这就是我在 UPDATEINSERT 操作之后所期望的输出:-

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

我的问题是如何实现这一目标?

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



这里是代码 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 {
    
            /* 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;
            }
        }
    

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-06-09
    • 2019-03-25
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多