如何解决为什么不能在Spring Data Mongo DB中使用“更新”操作?
我使用Spring Data MongoDb在数据库中保存文档。
@Repository
public interface UserRepository extends MongoRepository<User,ObjectId> {
Optional<User> findByUsername(String userName);
}
@Document(collection = "users")
public class User {
@Id
private ObjectId id;
@Indexed(unique = true)
private String username;
...
@Service
public class UserUpdateServiceImpl implements UserUpdateService {
private UserRepository repository;
private UserMapper mapper;
@Autowired
public UserUpdateServiceImpl(UserRepository repository,UserMapper mapper) {
this.repository = repository;
this.mapper = mapper;
}
@Override
public void updateDocumentInCollection(UserDto userDto) {
User user = mapper.toEntity(userDto);
repository.save(user);
}
}
org.springframework.dao.IncorrectResultSizeDataAccessException:查询 {“ $ java”:查询:{“ username”:“ user”},字段:{},排序:{}} 返回了非唯一结果。
更新_2
我使用了insert
操作
/**
* Inserts the given entity. Assumes the instance to be new to be able to apply insertion optimizations. Use the
* returned instance for further operations as the save operation might have changed the entity instance completely.
* Prefer using {@link #save(Object)} instead to avoid the usage of store-specific API.
*
* @param entity must not be {@literal null}.
* @return the saved entity
* @since 1.7
*/
<S extends T> S insert(S entity);
public void updateUser(UserDto userDto) {
User user = mapper.toEntity(userDto);
userRepository.insert(user);
}
它再次导致错误。
org.springframework.dao.DuplicateKeyException:E11000重复密钥 错误集合:mongo-spring.users索引: id dup键:{_id: ObjectId('5f3b786085c7d32787990955')};嵌套异常为 com.mongodb.MongoWriteException:E11000重复键错误 集合:mongo-spring.users索引: id dup键:{_id: ObjectId('5f3b786085c7d32787990955')}
Update_3
我运行单元测试。
@Test
void updateUser() {
UserDto user = readService.getDataOfUserByName("user");
user.setEnabled(true);
user.setAccountNonLocked(true);
List<Role> authorities = user.getAuthorities();
authorities.add(Role.ADMIN);
user.setAuthorities(authorities);
if(user.getUsername() != null)
userUpdateService.updateUser(user);
}
@Override
public void updateUser(UserDto userDto) {
User user = mapper.toEntity(userDto);
userRepository.save(user);
}
- 映射器
public interface CommonMapper<D,E>{
D toDto(E e);
E toEntity(D d);
Iterable<D> toListDto(Iterable<E> entityList);
Iterable<E> toListEntity(Iterable<D> dtoList);
}
@Mapper(componentModel = "spring")
public interface UserMapper extends CommonMapper<UserDto,User> {
}
现在可以使用。
当我尝试更新记录时,出现异常...
解决方法
您的代码指定用户名必须唯一:
@Indexed(unique = true)
private String username;
但是似乎您的数据库中已经有多个条目要尝试保存的用户的用户名。
首先,您需要清理现有的重复条目。然后,您需要确定在这种情况下要发生的情况:要更新现有对象,还是要返回一个错误,表明用户名已被使用。
在两种情况下,您都需要先查找现有用户:
User user = repository.findByUsername(userDto.getUsername());
if(user == null) {
user = mapper.toEntity(userDto);
}
else {
mapper.updateUserFromDto(user,userDto);
//OR: throw an exception
}
repository.save(user);
如果您的用户实体只是获取者/设置者,并且您确定DTO中的所有字段也都在您的实体中,那么您也可以将mapper.toEntity
重复用于更新,但是我不建议这样做:
User user = repository.findByUsername(userDto.getUsername());
if(user == null) {
user = mapper.toEntity(userDto);
}
else {
User updatedUser = mapper.toEntity(userDto);
updatedUser.setId(user.getId()); // This changes the save from insert to update
user = updatedUser;
}
repository.save(user);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。