Операции CREATE и UPDATE при параллельной обработке с использованием CRUD Repository - PullRequest
0 голосов
/ 21 октября 2018

Я разрабатываю приложение, в котором я получаю два события из вышестоящей системы: 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]

Но я хотел только значения, которые были null после первой операции UPDATE для вставки при выполнении операции CREATE .Но операция CREATE перезаписывает обновленные поля и, следовательно, обновления теряются.В общем, это то, что я ожидаю в качестве вывода после операций UPDATE и INSERT : -

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

Мой вопрос заключается в том, чтоКак мне этого добиться?

Примечание: Я использую CRUD Repository и предпочитаю решение, которое использует CRUD Repository только для операций с базой данных.



Вот фрагмент кода: -

  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 голосов
/ 21 октября 2018

Начиная с 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...