Erro estranho e só na minha máquina

Java

10/05/2011

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

Curtidas 0

Respostas

Anthony Accioly

Anthony Accioly

10/05/2011

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.
GOSTEI 0
Davi Costa

Davi Costa

10/05/2011

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





GOSTEI 0
Davi Costa

Davi Costa

10/05/2011

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
GOSTEI 0
Pjava

Pjava

10/05/2011

isso foi um amigo que fez. Vou mudar isso e ver como fica. Vou pesquisar bastante isso e ver como fica.
GOSTEI 0
Dyego Carmo

Dyego Carmo

10/05/2011

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

Já vi vários problemas referente a sequences quando deixados para criar "automagicamente"
GOSTEI 0
Pjava

Pjava

10/05/2011

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

Anthony Accioly

10/05/2011


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).
GOSTEI 0
Pjava

Pjava

10/05/2011

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

GOSTEI 0
Davi Costa

Davi Costa

10/05/2011

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

GOSTEI 0
Anthony Accioly

Anthony Accioly

10/05/2011


Veja o meu bean:
 


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

Anthony Accioly

10/05/2011

Resolvido?

Se sim, por favor atualize o status da chamada.
GOSTEI 0
Pjava

Pjava

10/05/2011

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.
GOSTEI 0
POSTAR