spring data jpa save 返回 主鍵問題
阿新 • • 發佈:2018-11-25
除錯時發現,如果呼叫 Repository 的 save 方法時,對應的主鍵,還是為空。以為是什麼bug。
後面查閱資料發現。其實是在返回值中,而不是傳入值中。
檢視SimpleJpaRepository原始碼,除錯發現,如果是走persist(新增,判斷是否新,是看是不是null,如果主鍵是空字串,也是走的merge)。 傳入的物件裡面的主鍵會有值。
如果是走merge,走完了,傳入的物件不會有值,而是返回的 裡面有值。
@Transactional public <S extends T> S save(S entity) { if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } }
User aaa=save(user);
如上,user 如果 主鍵為null的時候,user和aaa是一樣的,都有主鍵。如果主鍵不為null,比如空字元,或者更新的時候(內部判斷不是isNew的時候),user裡面主鍵還是和原來一樣,空的,而aaa中是有值的。
附上 isNew的程式碼。 AbstractEntityInformation 類中。
public boolean isNew(T entity) { ID id = getId(entity); Class<ID> idType = getIdType(); if (!idType.isPrimitive()) { return id == null; } if (id instanceof Number) { return ((Number) id).longValue() == 0L; } throw new IllegalArgumentException(String.format("Unsupported primitive id type %s!", idType)); }
我的實體類主鍵程式碼如下
@Id @GeneratedValue (generator = "pk") @GenericGenerator (name = "pk", strategy = "uuid2") @Column (name = "Role_Guid") public String getRoleGuid() { return this.roleGuid; }
結論,用返回的物件就對了。
參考:https://stackoverflow.com/questions/16351156/spring-data-jpa-save-can-not-get-id