【发布时间】:2020-12-02 23:51:36
【问题描述】:
你能给我一个想法如何做到这一点:创建一个规则,当保存一个城市时,系统不接受同一个州的两个同名城市?
我正在使用弹簧靴...
我的 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);
}
}
我应该在哪里创建规则以避免在数据库中重复城市?当用户搜索时,我只希望一个州只有一个城市......
【问题讨论】:
-
能否请您添加现有代码,最好回答。
-
哦@Sri 我完成了... =)
-
你能不能用@Column(unique = true) 表示城市试试
-
@Sri 我在哪个班级测试这个?
-
请添加其他实体类即Estado的代码,正确映射请参考stackoverflow.com/questions/13256569/…
标签: java spring spring-boot