Я разрабатываю приложение, в котором я получаю два события от восходящей системы, то есть СОЗДАЙТЕ и ОБНОВИТЬ. Теперь рассмотрим следующие события:
1. CREATE User [id=1, name=Ram, city=Delhi, [email protected], phone=12345]
2. UPDATE User [id=1, city=Mumbai, phone=56789]
Поскольку приложение включает в себя параллельную обработку, порядок события не гарантируется, и, следовательно, событие UPDATE может предшествовать событию CREATE.
Для операции UPDATE это то, что хранится в базе данных: -
[id=1, name=null, city=Mumbai, email=null, phone=56789]
Однако, когда я выполняю операцию CREATE, обновленные поля заменяются старыми значениями, и это то, что сохраняется в базе данных.
[id=1, name=Ram, city=Delhi, [email protected], phone=12345]
Но я хотел, чтобы при выполнении СОЗДАТЬ операцию были вставлены только значения, которые были нулевой после первого ОБНОВЛЕНИЕ. Но СОЗДАТЬ операцию перезаписывает обновленные поля, и, следовательно, обновления теряются. Итак, в основном, это то, что я ожидаю в качестве результата после ОБНОВИТЬ и INSERT операции: -
[id=1, name=Ram, city=Mumbai, [email protected], phone=56789]
My question is that how do I achieve this ?
Note: I am using CRUD Repository and prefer a solution which uses CRUD Repository only for database operations.
Вот фрагмент кода: -
Класс сущности: -
@Entity
public class User {
@Id
private Integer id;
private String name;
private String city;
private String email;
private String phone;
//Setters and Getters
}
Репозиторий: -
import org.springframework.data.repository.CrudRepository;
import com.therealdanvega.domain.User;
public interface UserRepository extends CrudRepository<User, Integer>{
}
Класс приложения: -
@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 protected], phone=12345]
}
public User createUser(User user) {
user.setId(1);
user.setName("Ram");
user.setCity("Delhi");
user.setEmail("[email protected]");
user.setPhone("12345");
return user;
}
public User updateUser(User user) {
user.setId(1);
user.setCity("Mumbai");
user.setPhone("56789");
return user;
}
}


Начиная с 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);
}
Вы создаете класс RestController и создаете два метода и карту с PostMapping и GetMapping.