首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建不重复该属性的规则

创建不重复该属性的规则
EN

Stack Overflow用户
提问于 2020-12-03 07:51:36
回答 1查看 37关注 0票数 0

你能给我一个​​的想法如何做到这一点:创建一个规则,当保存一个城市时,系统不接受同一州的两个同名城市?

我用的是弹簧靴..。

我的Cidade实体:

代码语言:javascript
复制
@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资源:

代码语言:javascript
复制
@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);
    }
        
}

我应该在哪里创建规则,以避免在数据库中重复城市?我只希望当用户搜索时,一个州只有一个城市...

EN

回答 1

Stack Overflow用户

发布于 2020-12-03 22:25:03

我用help来管理

代码语言:javascript
复制
    ALTER TABLE cidade
    ADD CONSTRAINT uk_cidade UNIQUE (estado_id, nome);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65117881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档