V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
godleon
V2EX  ›  Java

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

  •  
  •   godleon · 2023-03-15 16:45:14 +08:00 · 1164 次点击
    这是一个创建于 401 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求

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

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

    远程调用,也能做会话跟踪,不过跟踪的设计难度和实施成本,太高了。如果只是要获取数据库实际添加的自增 ID ,相比于跟踪实体类并从 save 后的实体类获取,从 save 方法的返回值获取,更具备可取性。也就是 3 楼的方法。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1241 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 17:46 · PVG 01:46 · LAX 10:46 · JFK 13:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.