想请教一下 Java 远程调用其他服务执行保存,如何通过实体类拿到自增 id?

2023-03-15 16:45:14 +08:00
 godleon

需求

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;
}

1173 次点击
所在节点    Java
8 条回复
cslive
2023-03-15 16:51:29 +08:00
B 服务不返回 id ,你是拿不到的
godleon
2023-03-15 16:57:14 +08:00
@cslive 就是想看看有没有办法实现出来类似于 在 mybatis 中 mapper 里增加 keyProperty=id ,useGeneratedKeys=true 可以赋值到实体类的自增主键上,但是这个好像只能在单服务里玩,远程调用就不行了
urnoob
2023-03-15 16:59:42 +08:00
远程 B 返回 id ,自己的底层代码里 set 进去
zhangqian99
2023-03-15 17:04:11 +08:00
你再查一下不就行了
wentz
2023-03-15 17:15:04 +08:00
写到 redis
summerLast
2023-03-15 17:29:35 +08:00
remoteB

void savePerson(person) {
String id = bClient.post(persion)
persion.setId(id)
}
xuanbg
2023-03-15 19:02:38 +08:00
有两种办法,第一种就是 B 服务接口返回 ID 。另一种方法是改成雪花 ID ,你生成好赋值 id 一起传过去。B 服务直接保存数据不再生成 ID 。我一般两种都支持,B 服务不但有接口,也可以通过 MQ 来同步数据。
nothingistrue
2023-03-16 09:45:47 +08:00
Save 之后,实体类的 id 被更新为数据库中实际添加的自增 ID ,这其实是一种维持实体类跟数据库中的记录同步的措施。完整的措施,是要对实体类做会话跟踪的,这样才能保证,最起码当前会话中,实体类对象根数据库表中的记录,是完全同步的。

远程调用,也能做会话跟踪,不过跟踪的设计难度和实施成本,太高了。如果只是要获取数据库实际添加的自增 ID ,相比于跟踪实体类并从 save 后的实体类获取,从 save 方法的返回值获取,更具备可取性。也就是 3 楼的方法。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/924248

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX