spring data jpa save 返回 主键问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/laokaizzz/article/details/82493047

调试时发现,如果调用 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

猜你喜欢

转载自blog.csdn.net/laokaizzz/article/details/82493047