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 2023-03-15 16:51:29 +08:00
B 服务不返回 id ,你是拿不到的
|
2
godleon OP @cslive 就是想看看有没有办法实现出来类似于 在 mybatis 中 mapper 里增加 keyProperty=id ,useGeneratedKeys=true 可以赋值到实体类的自增主键上,但是这个好像只能在单服务里玩,远程调用就不行了
|
3
urnoob 2023-03-15 16:59:42 +08:00
远程 B 返回 id ,自己的底层代码里 set 进去
|
4
zhangqian99 2023-03-15 17:04:11 +08:00
你再查一下不就行了
|
5
wentz 2023-03-15 17:15:04 +08:00
写到 redis
|
6
summerLast 2023-03-15 17:29:35 +08:00
|
7
xuanbg 2023-03-15 19:02:38 +08:00
有两种办法,第一种就是 B 服务接口返回 ID 。另一种方法是改成雪花 ID ,你生成好赋值 id 一起传过去。B 服务直接保存数据不再生成 ID 。我一般两种都支持,B 服务不但有接口,也可以通过 MQ 来同步数据。
|
8
nothingistrue 2023-03-16 09:45:47 +08:00
Save 之后,实体类的 id 被更新为数据库中实际添加的自增 ID ,这其实是一种维持实体类跟数据库中的记录同步的措施。完整的措施,是要对实体类做会话跟踪的,这样才能保证,最起码当前会话中,实体类对象根数据库表中的记录,是完全同步的。
远程调用,也能做会话跟踪,不过跟踪的设计难度和实施成本,太高了。如果只是要获取数据库实际添加的自增 ID ,相比于跟踪实体类并从 save 后的实体类获取,从 save 方法的返回值获取,更具备可取性。也就是 3 楼的方法。 |