Spring JPA Save()物件後返回該物件ID為0解決辦法
阿新 • • 發佈:2018-11-02
springdatajpa是很好用 的一個工具,但是!首先你要會用
今天下午就被一個spring-data-jpa的問題卡了略久,因為想要用MySQL自增id,想要在save之後獲取這個儲存的實體的id進行後續的工作,一直以為springdatajpa中的save方法執行結束之後,save(entity)中的entity就會自動被更新為儲存的entity,但是其實不是這樣的,今天用intellij的debug工具跟蹤程式碼,發現save之後這個實體的id總是為0,既然這樣那用save返回的entity的id總該行了吧,改了之後發現save返回的entity的id也是0,這就很尷尬了
上網谷歌一下,找到一個說要在save之後flush一下這個repository,然而試了之後並沒有什麼卵用
繼續谷歌,發現一個springdatajpa的坑,springdatajpa其實是hibernate的一個比較高階的封裝庫,更好用了,但是底層還是用hibernate實現的,save方法其實就是hibernate的持久化方法,它是不會自動返回儲存的實體的,那要怎麼獲取到這個儲存的實體呢?
方法一:
//該註解一定要在getter方法上
@Id
@Column(name = "id", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
return id;
}
必須要加上這句話,spring data jpa才會知道你想要拿到這個儲存後的實體,再返回這個實體
在你想要拿到自增id的列上加上@GeneratedValue,spring data jpa就會儲存這個實體,並更新傳入的實體為儲存後的實體(其實就是hibernate返回了一下吧我覺得),這樣的話,save(xxx)後xxx就已經更新為已經儲存的實體了
方法二:
// 使用saveAndFlush方法
myobject = repository.saveAndFlush(myobject);
使用saveAndFlush方法,來代替save方法
spring-data-jpa之坑,記錄備忘