你能给我一个的想法如何做到这一点:创建一个规则,当保存一个城市时,系统不接受同一州的两个同名城市?
我用的是弹簧靴..。
我的Cidade实体:
@Getter
@Setter
@Entity
@SQLDelete(sql = "UPDATE Cidade SET ativo = 0 WHERE id = ?")
@Where(clause = "ativo = 1")
public class Cidade extends BaseEntity {
private String nome;
private String sigla;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(nullable = false)
private Estado estado;
private Double populacao;
}我的Cidade资源:
@RestController
@RequestMapping("/api/cidade")
public class CidadeResource {
@Autowired
private CidadeRepository repository;
@Autowired
private EstadoRepository repositoryEstado;
@Autowired
private CidadeResourceMapper mapper;
@GetMapping(produces = { MediaType.APPLICATION_JSON_VALUE })
public ResponseEntity<PageDto<CidadeDTO>> getPageWithQuery(@QuerydslPredicate(root = Cidade.class ) Predicate predicate, Pageable pageble) {
return ResponseEntity.ok(convertToPageDto(predicate, pageble));
}
@PostMapping
public ResponseEntity<CidadeDTO> add(@Valid @RequestBody CidadeWriteDTO dto) throws Exception {
Cidade entity = this.mapper.fromDto(dto);
entity = repository.save(entity);
ResponseEntity<CidadeDTO> re = ResponseEntity.ok(this.convertToDto(entity));
return re;
}
@GetMapping(value = "/{id}")
public ResponseEntity<CidadeDTO> get(@PathVariable Integer id) {
return ResponseEntity.ok(convertToDto(repository.findById(id).get()));
}
@PutMapping(value = "/{id}")
public ResponseEntity<CidadeDTO> update(@Valid @RequestBody CidadeWriteDTO dto, @PathVariable Integer id) throws AppException {
Optional<Cidade> entity = repository.findById(id);
if (entity.isPresent()) {
Double qtdPopulacao = 0D;
if (entity.get().getEstado().getPopulacao() == null)
qtdPopulacao = entity.get().getPopulacao();
else {
// Remove a população da cidade (antes da alteração)
qtdPopulacao = entity.get().getEstado().getPopulacao() - entity.get().getPopulacao();
}
this.mapper.merge(entity.get(), dto);
// Adiciona a população da cidade
qtdPopulacao += dto.getPopulacao();
// Atualiza os dados no estado
entity.get().getEstado().setPopulacao(qtdPopulacao);
// Salva a entidade no BD
repositoryEstado.save(entity.get().getEstado());
if (dto.getPopulacao() < 0)
throw new AppException("Valor inválido da quantidade da população");
Cidade mergedEntity = repository.save(entity.get());
ResponseEntity<CidadeDTO> re = ResponseEntity.ok(this.convertToDto(mergedEntity));
return re;
} else {
throw new RuntimeException();
}
}
@DeleteMapping(value = "/{id}")
public void delete(@PathVariable Integer id) throws Exception {
repository.deleteById(id);
}
private PageDto<CidadeDTO> convertToPageDto(Predicate predicate, Pageable pageble) {
Page<Cidade> pageEntity = repository.findAll(predicate, pageble);
return new PageDto<>(StreamSupport.stream(pageEntity.spliterator(), false).map(this::convertToDto)
.collect(Collectors.toList()), pageEntity.getTotalElements());
}
private CidadeDTO convertToDto(Cidade entity) {
return mapper.toDto(entity);
}
}我应该在哪里创建规则,以避免在数据库中重复城市?我只希望当用户搜索时,一个州只有一个城市...
发布于 2020-12-03 22:25:03
我用help来管理
ALTER TABLE cidade
ADD CONSTRAINT uk_cidade UNIQUE (estado_id, nome);https://stackoverflow.com/questions/65117881
复制相似问题