【发布时间】:2018-10-21 08:45:34
【问题描述】:
我正在设计一个应用程序,我从上游系统获取两个事件,即 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 存储库用于数据库操作的解决方案。
这里是代码 sn-p :-
-
实体类:-
@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; } }
【问题讨论】:
-
您创建了一个 RestController 类并创建了两个方法并使用 PostMapping 和 PutMapping 进行映射。
标签: sql spring hibernate spring-boot spring-data-jpa