Ola,
Estava tendo dificuldades pra validar o email com unique constrait. Usando Spring-Data JPA, pq a exception disparada nao funciona para usar no bloco try/catch. Entao resolvi fazer um validador. O validador funciona, porem quando vai editar a entidade, ele tambem valida o email. Nesse caso fiz a solucao dessa maneira, porem gostaria de saber se essa é a forma certa. Se tem uma forma mais elegante. Eu fiz a validacao dessa forma para o campo na view ficar destacado, mas poderia disparar um NegocioException tambem, mas qual a melhor maneira?
public void validarEmail(FacesContext context, UIComponent toValidate, Object value) {
    Integer idUsuario = null;
    
    UIComponent pai = toValidate.getParent();
    for (UIComponent input : pai.getChildren()) {
        if (input.getId().equals("idUsuario")) {
            idUsuario = (Integer) ((UIInput) input).getValue();
        }
    }
    String email = (String) value;
    Usuario validaUsuario = usuarioService.findByEmail(email);
    if (validaUsuario != null && idUsuario==null) {
        ((UIInput) toValidate).setValid(false);
        FacesUtil.adicionarMensagemErro("Ja existe usuário cadastrado com esse email.", null);
    }
}