Erro estranho e só na minha máquina
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.
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
Curtidas 0
Respostas
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:
Onde escola_escola_id_seq é uma sequencia válida criada no seu banco:
E, muito provavalmente no ID tem algo assim:
Todos os três passos tem que ser executados corretamente para que isso funcione.
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
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
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
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
É só conferir e sequences no banco se o nome gerado lá tá batendo com o que vc mapeou.
Att Davi
GOSTEI 0
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
10/05/2011
Você criou essa "sequencia" no banco de dados ?
Já vi vários problemas referente a sequences quando deixados para criar "automagicamente"
Já vi vários problemas referente a sequences quando deixados para criar "automagicamente"
GOSTEI 0
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
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
10/05/2011
Sim criei um campo serial e ele mesmo criou a sequence nesse padrão. Veja o meu bean:
(cabeçalho)
(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 outrosGOSTEI 0
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
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
10/05/2011
Veja o meu bean:
Paulo, se o campo é serial
@GeneratedValue(strategy=GenerationType.IDENTITY)
Nesse caso você poderia limar o SequenceGenerator.
GOSTEI 0
Anthony Accioly
10/05/2011
Resolvido?
Se sim, por favor atualize o status da chamada.
Se sim, por favor atualize o status da chamada.
GOSTEI 0
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