Comparar dados antes de gravar e atualizar javaee/jsf

Ola. Preciso deum auxilio. Estou estudando jsf e estou desenvolvolveno uma aplicação para fins de estudo mesmo. A questao é a seguinte. Ante de gravar no banco de dados, a aplcação analise o seguinte:

  • Ao salvar, verifica antes se o nome do setor já exista no banco de dados (postgres), senão existir, grave, senao nao permita;
  • Ao atualizar, tbem execute a mesma analise e atualize os dados, se alterar o nome, tem que analisar se este nome já existe no banco de dados pra nao salvar repetido.
  • Data de cadastro deve ser em ao salvar e e data de alteração tem que ser em atualizar.
    Arquivo entidade:

meu bean:

meu GenericDAO

minha parte do pagina xhtml (botao salvar:

minhar parte da pagina xhtml onde faz edição:

É isso, se alguem puder me ajudar, agradeço.

Faz uma query e verifique se existe.
Caso você não saiba, o entityManager tem um método chamado createQuery, você pode usa-lo para checar

Mesma lógica que o de cima

Mike, peço desculpas, pois estou inicianto, mas mas voce teria um exemplo de como fazer? Tem mais um detalhe, quando atualizar, onde eu colocaria o “setor.setDataAlteracao(new Date());”, pos se eu colacar no metodo salvar ele irá atualizar o :“setor.setDataCadastro(new Date());” tamem, e ao seria interressante , já que dataalteracao será diferente da datacadastro.

Sobre a data, acredito que isso resolva:

if(setor.getDataCadastro == null){
setor.setDataCadastro(new Date());
}

Explicando: Como você chama o método editar ao selecionar um setor em um grid, provavelmente a dataCadasto virá do banco também, então, você só irá setar a data quando esta for nula, no caso, quando for inserir um novo setor.

Acredito que se você definir o id como sendo o nome do setor resolveria o problema.

Se você não quer setar o valor, só não setar

public boolean existByName(Setor setor) {

    entityManager.createQuery("SELECT s FROM Setor s WHERE s.nome = :nomeDoSetor");
    entityManager.setParameter("nomeDoSetor", setor.getNome());

    //Se a lista for maior que 0, então quer dizer que existe (true)
    if(entityManager.getResultList().size() > 0) {
        return true;
    }
    else {
        return false;
    }
}
if(setorDAO.existByName(setor)) {//Se já existe um setor
    
}
else {//Se não existe
    
}

Tem como trocar esse entityManager por hql?? Como seria em hql?

Achei esse codigo na net e estou tentando nplementa-lo no meu projeto, porem ele cai direto na ultima linha do odigo onde esta " Util.criarAvisoErro(“erro " + e);”

meu controlador:

public boolean salvar(Setor setor) {
boolean ok;
try {
if (setor.getId() == null) {

            String hql = "SELECT z FROM Setor z"
                    + " WHERE z.nome='" + setor.getNome() + "'";

            Setor verifica = this.dao.carregar(hql);

            if (verifica == null) {
                setor.setUsuarioAlteracao(Util.usuarioLogado());
                setor.setDataCadastro(new Date());
                setor.setDataAlteracao(new Date());
                this.dao.salvar(setor);
                Util.criarAviso("setor salvo com sucesso");
                ok = true;
            } else {
                Util.criarAvisoErro("setor ja existe");
                ok = false;
            }
        } else {

            String hql = "SELECT z FROM Setor z"
                    + " WHERE z.nome='" + setor.getNome() + "'"
                    + " AND z.id!=" + setor.getId() + "";

            Setor verifica = this.dao.carregar(hql);

            if (verifica == null) {
                setor.setUsuarioAlteracao(Util.usuarioLogado());
                setor.setDataAlteracao(new Date());
                this.dao.atualizar(setor);
                Util.criarAviso("setor atualizado com sucesso");
                ok = true;
            } else {
                Util.criarAvisoErro("setor ja existe");
                ok = false;
            }
        }
    } catch (Exception e) {
        Util.criarAvisoErro("erro: " + e);
        ok = false;
    }
    return ok;
}

public boolean excluir(Setor setor) {
    boolean ok;
    try {
        this.dao.excluir(setor);
        Util.criarAviso("setor excluido com sucesso");
        ok = true;
    } catch (Exception e) {
        Util.criarAvisoErro("erro " + e);
        ok = false;
    }
    return ok;
}

meu carregar hql está no setorDAO:

@Override
public Setor carregar(String hql) {
return (Setor) this.sessao.createQuery(hql).setCacheable(true).uniqueResult();
}

botao do form onde eu insiro a funcao:

if (new SetorControlador().salvar(this.setor)) {
Setor nn = new Setor();
nn.setNome(setor.getText());
nn.setStatus(setor.getSelectedText());
nn.setDataCadastro(new Date());

        DesktopNotify.showDesktopMessage("<<I N F O R M A Ç Ã O >>", "SETOR:\n" + setor.getText() + " \nGRAVADOS COM SUCESSO!!",
                DesktopNotify.SUCCESS, 4000);
    }

porem nao ta dando certo, onde eu estou errando? como implementar correto esses codigos?