2017-04-08 137 views
0

我一直在玩JDBC和Spring JPA,让我想到的是Spring如何获取保存对象的ID。 我已经扩展JpaRepository:JPA如何获取持久化对象的自动生成ID?

interface UserAccountRepository 
    extends JpaRepository<UserAccount, Integer> { 
} 

救了我的对象:

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

MySQL的日志显示了这些操作:

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

2017-04-08T12:54:52.206061Z 78将查询插入到user_account(密码,用户名)值('encrypted密码”, '用户')

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

2017-04-08T12:54:78 52.211045Z查询SET自动提交= 1

既然插入操作没有返回任何东西(或者我错过了什么?),Spring怎么可能知道这个id而没有任何额外的查询呢?

+0

https://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#getGeneratedKeys-- –

+0

春犯规得到任何东西。 Spring不做JPA。 JPA提供者执行JPA –

回答

1

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

望着Hibernate的ORM的source code(我想这是你在Spring中使用的一个),看起来它执行此查询知道最后插入的ID:

select last_insert_id()