2017-04-08 107 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()

相關問題