Fórum Erro estranho e só na minha máquina #400758

10/05/2011

0

Eu e um colega aqui trabalhamos juntos e na máquina dele não dá esse erro e na minha dá.
javax.servlet.ServletException: javax.persistence.PersistenceException: org.hibernate.AnnotationException: Unknown Id.generator: seq_escola root cause javax.faces.el.EvaluationException: javax.persistence.PersistenceException: org.hibernate.AnnotationException: Unknown Id.generator: seq_escola root causeAgora isso só aconteceu depois de eu tentar pegar o usuário logado e tive que fazer uma alteração assim:public List<Escola> findAll() {
       
        List <Escola> listEscola = null;
        try {
           
            HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            LoginControle loginControle = (LoginControle)   session.getAttribute("LoginControle");
            Login login = loginControle.getLogin();
           
            em.getTransaction().begin();
            Query query =  em.createQuery("select distinct esc from Escola esc ,Matricula mat" +
                                                          " where mat.idescola = esc.idescola" +
                                                          " and mat.idpessoa =  1 " + //login.getPessoa().getIdPessoa() +
                                                          " and mat.situacao = 'A' order by esc.nome");   
            listEscola = query.getResultList();
            em.getTransaction().commit();
           
        } catch (Exception e) {
            e.printStackTrace();
           
            if(em.getTransaction().isActive()){
                em.getTransaction().rollback();
            }
        }finally{
            em.close();
        }
       
        return listEscola;   
    }
Antes era assim:public List<Escola> findAll() {
        Query query =  getEntityManager().createQuery("select distinct esc from Escola esc ,Matricula mat" +
                                                      " where mat.idescola = esc.idescola" +
                                                      " and mat.idpessoa = 1 " +
                                                      " and mat.situacao = 'A' order by esc.nome");   
             return (List<Escola>) query.getResultList();   
    }   

Agora nenhum e nem outro e até o GlassFish começou a dar pau. É muito para mim.

Pjava

Pjava

Responder

Posts

10/05/2011

Anthony Accioly

Você está tentando usar uma anotação própria do JPA para indicar estratégia de geração de valores, o caso mais comum de uso para isso requer uma sequence criada no banco (a anotação provavelmente está  na sua classe de modelo).

No topo da sua entidade tem que ter algo assim:
@SequenceGenerator(name="ESCOLA_SEQ", sequenceName="escola_escola_id_seq")
 
Onde escola_escola_id_seq é uma sequencia válida criada no seu banco:
CREATE SEQUENCE escola_escola_id_seq;
 
E, muito provavalmente no ID tem algo assim:
@GeneratedValue(generator="ESCOLA_SEQ", strategy=GenerationType.SEQUENCE) 
 

Todos os três passos tem que ser executados corretamente para que isso funcione.
Responder

Gostei + 0

10/05/2011

Davi Costa

Cara toma um pouco de cuidado co

HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            LoginControle loginControle = (LoginControle)   session.getAttribute("LoginControle");
            Login login = loginControle.getLogin();

No seu serviço vc deve batsrair essa parteo ideal seria cv passar o id como parâmetro, vc está ferindo um pouco o padrão MVC, e se um dia vc criar um web service ou passar issopara uma app desktop, não vai conseguir reaproveitar código, cada camada sua deve ter sua resposabilidade e ver a Session não é da camada de serviços, reflita sobre isso tb.

Att Davi





Responder

Gostei + 0

10/05/2011

Davi Costa

Sobre o que o colega falou acima, cuidado com o create sequence, se vc estiver usando postgres e usou o type serial na coluna da tabela, não precisa executar esse create sequence não, o banco faz isso automaticamente p vc.
É só conferir e sequences no banco se o nome gerado lá tá batendo com o que vc mapeou.

Att Davi
Responder

Gostei + 0

10/05/2011

Pjava

isso foi um amigo que fez. Vou mudar isso e ver como fica. Vou pesquisar bastante isso e ver como fica.
Responder

Gostei + 0

10/05/2011

Dyego Carmo

Você criou essa "sequencia" no banco de dados ?

Já vi vários problemas referente a sequences quando deixados para criar "automagicamente"
Responder

Gostei + 0

10/05/2011

Pjava

Já fiz isso. Eu uso SERIAL e tá automático. Esse e o sequence q gerou o postgresql: escola_idescola_seq
Responder

Gostei + 0

10/05/2011

Anthony Accioly


se vc estiver usando postgres e usou o type serial na coluna da tabela, não precisa executar esse create sequence não, o banco faz isso automaticamente p vc.
 

Seria engraçado usar um generator para obter a mesma funcionalidade de um campo Serial, auto_increment ou identity (ok, isso acontece no Oracle por falta destes). Geralmente esses geradores são usados com sequences especiais, UUIDs, e coisas do tipo. Mas eu concordo que as vezes o código apareceu lá por engano (alguém acostumado com Oracle ou coisa do genero).
Responder

Gostei + 0

10/05/2011

Pjava

Sim criei um campo serial e ele mesmo criou a sequence nesse padrão. Veja o meu bean:
(cabeçalho)
@Entity
@Table(name="escola")
@SequenceGenerator(name="seq_escola", sequenceName="escola_idescola_seq")
public class Escola implements Serializable{
    
    @Id
    @GeneratedValue(generator="seq_escola", strategy=GenerationType.SEQUENCE) 
    @Column(name="idescola")
    private Integer idescola;
    @Column(name="nome")
    private String nome;
    @Column(name="telefone")
    private String telefone;
    @Column(name="fax")
    private String fax;
    @Column(name="email")
    private String email;

   getters/setters e outros

Responder

Gostei + 0

10/05/2011

Davi Costa

beleza Paulo, é só agora alterar no mapeamento da sua entidade.
Muita boa as dicas do Anthony Accioly, caso um dia vc altere a app para outro banco.
É muito importante vc ter esse conhecimento.

att Davi

Responder

Gostei + 0

10/05/2011

Anthony Accioly


Veja o meu bean:
 


Paulo, se o campo é serial 
@GeneratedValue(strategy=GenerationType.IDENTITY)
 Não seria suficiente?
Nesse caso você poderia limar o SequenceGenerator.
Responder

Gostei + 0

10/05/2011

Anthony Accioly

Resolvido?

Se sim, por favor atualize o status da chamada.
Responder

Gostei + 0

10/05/2011

Pjava

Esse erro é que alguém copiopu uma classe(Escola) e foi trocando onde tinha o nome Escola ele trocava por outro e esqueceu de fazer um e isso me derrubou a mim e a todos.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar