无论是实现功能较基本的CrudRepository接口 或者 可以提供分页等复杂操作的JpaRepository接口,所调用的save方法都是save+merge的功能。
需要注意若是一次更新操作,新传入的实体中有字段是null也将覆盖原有的数据,将原有的数据更新为null。
更新操作切记检查每个值包括Null覆盖的情况。
拓展学习: ReentrantReadWriteLock 可重入读写锁,分为读锁和写锁,使用举例(摘自官方实现源码):
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock read = lock.readLock();
private final Lock write = lock.writeLock();
public E getPersistentEntity(TypeInformation<?> type) {
Assert.notNull(type, "Type must not be null!");
try {
read.lock();
Optional<E> entity = persistentEntities.get(type);
if (entity != null) {
return entity.orElse(null);
}
} finally {
read.unlock();
}
if (!shouldCreatePersistentEntityFor(type)) {
try {
write.lock();
persistentEntities.put(type, NONE);
} finally {
write.unlock();
}
return null;
}
if (strict) {
throw new MappingException("Unknown persistent entity " + type);
}
return addPersistentEntity(type).orElse(null);
}
网友评论