【问题标题】:Create a rule to not repeat the attribute创建不重复属性的规则
【发布时间】: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


【解决方案1】:

我用help管理:

    ALTER TABLE cidade
    ADD CONSTRAINT uk_cidade UNIQUE (estado_id, nome);

【讨论】:

    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2015-12-27
    • 2013-08-05
    • 2021-04-13
    相关资源
    最近更新 更多