需求
A 服务里,一个方法
public void demo(){ //Person 对应 mysql 表 Person person = new Person(); person.setName("demo"); //远程调用 B 服务执行事务 remoteB.savePerson(person); //保存成功之后如何直接拿到 id ? person.getId(); } class Person(){ //自增主键 int id; String name; } 
A 服务里,一个方法
public void demo(){ //Person 对应 mysql 表 Person person = new Person(); person.setName("demo"); //远程调用 B 服务执行事务 remoteB.savePerson(person); //保存成功之后如何直接拿到 id ? person.getId(); } class Person(){ //自增主键 int id; String name; } 1 cslive Mar 15, 2023 B 服务不返回 id ,你是拿不到的 |
2 godleon OP @cslive 就是想看看有没有办法实现出来类似于 在 mybatis 中 mapper 里增加 keyProperty=id ,useGeneratedKeys=true 可以赋值到实体类的自增主键上,但是这个好像只能在单服务里玩,远程调用就不行了 |
3 urnoob Mar 15, 2023 远程 B 返回 id ,自己的底层代码里 set 进去 |
4 zhangqian99 Mar 15, 2023 你再查一下不就行了 |
5 wentz Mar 15, 2023 写到 redis |
6 summerLast Mar 15, 2023 |
7 xuanbg Mar 15, 2023 有两种办法,第一种就是 B 服务接口返回 ID 。另一种方法是改成雪花 ID ,你生成好赋值 id 一起传过去。B 服务直接保存数据不再生成 ID 。我一般两种都支持,B 服务不但有接口,也可以通过 MQ 来同步数据。 |
8 nothingistrue Mar 16, 2023 Save 之后,实体类的 id 被更新为数据库中实际添加的自增 ID ,这其实是一种维持实体类跟数据库中的记录同步的措施。完整的措施,是要对实体类做会话跟踪的,这样才能保证,最起码当前会话中,实体类对象根数据库表中的记录,是完全同步的。 远程调用,也能做会话跟踪,不过跟踪的设计难度和实施成本,太高了。如果只是要获取数据库实际添加的自增 ID ,相比于跟踪实体类并从 save 后的实体类获取,从 save 方法的返回值获取,更具备可取性。也就是 3 楼的方法。 |