我正在设计一个应用程序,该应用程序从上游系统接收两个事件,即 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操作,这是存储在数据库中的内容:-
[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存储库用于数据库操作的解决方案。
这是代码段:-
实体类:-
@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=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;
}
}
答案 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);
}