版权声明:本文为博主原创文章,未经博主允许不得转载。 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