【问题标题】:How does JPA gets auto-generated ID of persisted object?JPA 如何获取持久对象的自动生成 ID?
【发布时间】:2017-04-08 23:39:08
【问题描述】:

我一直在使用 JDBC 和 Spring JPA,让我想到 Spring 如何获取已保存对象的 ID。 我已经扩展了 JpaRepository:

interface UserAccountRepository
    extends JpaRepository<UserAccount, Integer> {
}

并保存了我的对象:

userAccountRepository.save(new UserAccount(
        null,
        username,
        passwordEncoder.encode(password)
));

MySQL 日志显示这些操作:

2017-04-08T12:54:52.107156Z 78 查询 SET autocommit=0

2017-04-08T12:54:52.206061Z 78 查询插入到 user_account(密码、用户名)值('encryptedpassword'、'user')

2017-04-08T12:54:52.206823Z 78 查询提交

2017-04-08T12:54:52.211045Z 78 查询 SET autocommit=1

既然插入操作没有返回任何东西(或者我错过了什么?)Spring 怎么可能在没有任何额外查询的情况下知道该 id?

【问题讨论】:

标签: java spring spring-data-jpa


【解决方案1】:

查看 Hibernate ORM 的 source code(我猜它是您在 Spring 中使用的那个),看起来它执行此查询以了解最后插入的 id:

select last_insert_id()

【讨论】:

    【解决方案2】:

    JDBC 可以返回作为语句一部分生成的键。这是一个例子:

      try(PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
        setParameters(parameterValues, statement);
    
        statement.execute();
    
        try(ResultSet rs = statement.getGeneratedKeys()) {
          if(rs.next()) {
            return rs.getObject(1);  // <-- contains the generated key
          }
    
          return null;
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      相关资源
      最近更新 更多