Erro com Hibernate + PostGre + auto incremento [RESOLVIDO]
32 respostas
andre_bento
Olá Pessoal.
Já li e reli um monte de tutorias e artigos aqui do fórum mas ainda não encontrei o meu erro.
Bem, é o seguinte, sou novato com o hibernate e estou precisando de ajuda com o autoincremento!
importjavax.persistence.Column;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.SequenceGenerator;importjavax.persistence.Table;importorg.hibernate.annotations.Entity;@Entity@Table(name="clientes")@SequenceGenerator(name="clientes_id_seq",sequenceName="clientes_id_seq")/** * Clientes generated by hbm2java */publicclassClientesimplementsjava.io.Serializable{privatestaticfinallongserialVersionUID=1L;@Id@Column(name="id")@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="clientes_id_seq")privatelongid;privateStringnome;privateStringcpf;...
Só que não está funcionando...Eu cadastro o primeiro e ele já começa do 0 quando vou cadastrar novamente ele não gera uma nova chave primária e gera o erro de Violação de Primary Key e acusa Could not execut JDBC bath update!
Por favor, me ajudem... já tentei de tudo e não consigo...
Abraço a todos!
Onde era o seu SEQ_CLIENTE substituí pelo meu clientes_id_seq… correto?
Mas continua gerando o mesmo erro… troquei minha tabela para bigint no banco e também fiz uma nova sequência para ela que ficou idêntica a outra, mas nada… até agora o mesmo erro…
Valeu pela força!!!
andre_bento
Amigos…
Eu reparei uma coisa no corpo do erro:
GRAVE: Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
Será que é ajuda?
diogoprosoft
Essa era o seu antigo código
@Entity@Table(name="clientes")@SequenceGenerator(name="clientes_id_seq",sequenceName="clientes_id_seq")/** * Clientes generated by hbm2java */publicclassClientesimplementsjava.io.Serializable{privatestaticfinallongserialVersionUID=1L;@Id@Column(name="id")@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="clientes_id_seq")privatelongid;privateStringnome;privateStringcpf;...
dê preferência em gerar as tebelas pelo hibernate.
andre_bento
Cara, ainda não deu certo…
Como eu faria para criar as tabelas a partir do hibernate?
Me dá esse help que talvez o erro suma…
Brigadão!
diogoprosoft
Cara te passo sim, só não tenho ele aqui agora mais assim que eu chegar em ksa te passo, não lembro de cabeça agora.
andre_bento
Beleza cara, eu estou tentando aqui seguir alguns tutos na net mas tá dose…
O erro continua ainda… talvez com ele gerando as tabelas evite esse tipo de erro.
Obrigado pela força, caso descubra no meu código ae alguma coisa que possa estar gerando o erro me fala ae pessoal!
andre_bento
Amigos…
Continuei tentando aqui mas sem sucesso…
Não consigo corrigir o erro, não sei o que pode estar havendo…
O lance é que parece que minha classe java não se comunica com a sequence criada no postgre, pois tem um campo no post dizendo : Já foi acessada? E lá está marcado como não!
Se precisarem de mais alguma parte do código por favor me falem…
Abraçoss e obrigado pela ajuda!
diogoprosoft
Ta na mão como prometido como gerar tabelas no banco
lendo seu codigo… uma das poucas diferenças que vejo é o tipo de dado da minha chave primaria…
fejohann
outra coisa que sofri para descobrir foi que estava setando o codigo e implementando o auto incremento…
da erro, óbvio…
posta o codigo da DAO, e o codigo do ação do botão em questão!!!
andre_bento
Olá amigo!
Obrigado pela ajuda!
Cara, se eu seto manualmente o BD funfa legal...
Tipo, eu fui e fui setando manualmente o id... colocando mais um pra não dar pau e ele funciona legal... faz pesquisas e tudo mais...
É só esse lance mesmo...
E tipo, quando eu coloco minha varíavel de banco como int ele não gera a sequence automaticamente... ae eu gerei manual mas foi exatamente a mesma coisa que o outro...
Estive olhando seu exemplo cara, esse seq_marca é o nome da sua sequence no postgre... correto?
Segue o código DAO:
publicclassDAOCliente{privatestaticSessionFactoryfactory;static{try{factory=newConfiguration().configure().buildSessionFactory();}catch(Exceptione){JOptionPane.showMessageDialog(null,"ERRO AO CONECTAR:"+e);}}publicstaticSessiongetSession(){returnfactory.openSession();}publicvoidinserir(testehibernate.Clientesc){Sessionsession=getSession();Transactiont=session.beginTransaction();session.save(c);t.commit();session.close();}
E segue o código de ação, não é um botão, executa direto no main pois é só um teste:
vc tem esse codigo na seq do seu bd… tenta colocar o START EM 10, ou colocar para o proximo valor do id do seu banco…
pelo erro, vc esta tentando duplicar uma chave… e esta iniciando em 1, e pelo que relatou ja tem mais de um registro…
testa ai!!!
andre_bento
Olá amigo!
Cara, diz isso que vc falou mas ainda assim não funcionou…
Mas agora ele chamou a sequence…porque no campo foi chamada? do postgre ele agora mudou para sim…
Mas coloquei o start em 10 e nada…
Tentei também zerar a tabela pra ver se ia mas não deu nada também… mesmo colocando o start em 10 quando executei ele parece que chamou a sequence mas começou a chave com 0…
Heeeeelp!!!
O que vc acha cara?
fejohann
posta ai como esta o seu codigo agora… classe, dao, tabela do bd, sequence…
to com tempo agr!!!
andre_bento
Vamo lá:
Classe:
importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.SequenceGenerator;importorg.hibernate.annotations.Entity;@Entity@SequenceGenerator(name="clientes_id_seq",sequenceName="clientes_id_seq",allocationSize=1)/** * Clientes generated by hbm2java */publicclassClientesimplementsjava.io.Serializable{privatestaticfinallongserialVersionUID=1L;@Id@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="clientes_id_seq")privatelongid;privateStringnome;privateStringcpf;publicClientes(){}publicClientes(longid){this.id=id;}publicClientes(longid,Stringnome,Stringcpf){this.id=id;this.nome=nome;this.cpf=cpf;}publiclonggetId(){returnthis.id;}publicvoidsetId(longid){this.id=id;}publicStringgetNome(){returnthis.nome;}publicvoidsetNome(Stringnome){this.nome=nome;}publicStringgetCpf(){returnthis.cpf;}publicvoidsetCpf(Stringcpf){this.cpf=cpf;}}
DAO:
importjava.util.List;importjavax.swing.JOptionPane;importorg.hibernate.Criteria;importorg.hibernate.Query;importtestehibernate.Clientes;importorg.hibernate.Session;importorg.hibernate.SessionFactory;importorg.hibernate.Transaction;importorg.hibernate.cfg.Configuration;importorg.hibernate.criterion.Restrictions;/** * * @author Andre */publicclassDAOCliente{privatestaticSessionFactoryfactory;static{try{factory=newConfiguration().configure().buildSessionFactory();}catch(Exceptione){JOptionPane.showMessageDialog(null,"ERRO AO CONECTAR:"+e);}}publicstaticSessiongetSession(){returnfactory.openSession();}publicvoidinserir(testehibernate.Clientesc){Sessionsession=getSession();Transactiont=session.beginTransaction();session.save(c);t.commit();session.close();}publicvoiddelete(Clientesc){Sessionsession=factory.openSession();session.delete(c);session.flush();session.close();}publicClientesgetOne(Stringpk)throwsException{Sessionsession=getSession();Clientesc=newClientes();JOptionPane.showMessageDialog(null,pk);Transactiont=session.beginTransaction();Criteriaselect=session.createCriteria(Clientes.class);select.add(Restrictions.like("id",pk));List<Clientes>l=select.list();c.setNome(l.get(0).getNome());c.setCpf(l.get(0).getCpf());c.setId(l.get(0).getId());returnc;}
cara, tenta além disso mudar a tua chave primaria para integer, e na classe para int…
andre_bento
Amigão… vou tentar isso entao…
Mas teria que ser bigint ou int normal cara?
Vou ter que criar a sequence na mão lá depois também…
Agora estou indo pro horário de almoço cara… volto daqui a pouco e se der certo eu te falo aqui… se não te falo também …rsrsrs
Muito obrigado peloa força amigão!
Abraços
fejohann
normal…
se não me engano um int vai até
2 147 483 647…
ou seja, é muito registro!!!
fejohann
outra coisa, no seu DAO … inserir … pq esta testehibernate.Clientes c ??
tenta deixar só Clientes c
andre_bento
Olá amigo!
Cara, ainda não consegui…já tentei criar a tabela a partir do hibernate e nada…
Eu tento mudar no BD a variável ID para int mas sempre que coloco integer na variável e seto ela como PK ela vai para serial…
Ae na hora de executar ele dá erro de cast e diz que não consegue converter esse tipo long para integer.
Caramba… não sei mais o que pode ser isso galera… por favor… me ajuuuudem!!!
andre_bento
Pessoal…
Alguém poderia me passar um code de uma classe completa aqui e também o BD para que eu faça um teste pra ver se funfa?
A classe… e o BD…
Não consigo resolver esse problema de jeito nenhum aqui!
andre_bento
Pessoal, é o seguinte…
PArece mesmo que o hibernate não consegue “chamar” a sequence…Porque testei a sequence direto no banco e ela tá funcionando legal… inseri alguns records direto no banco e ele gerou direitim os ids do pessoal…
O problema são com os annotatios do hibernate, não sei se estão todos certos mas parece que eles não conseguem se comunicar com a sequence no BD!!
Por favor, me ajudem, pois não to conseguindo resolver isso de jeito nenhum pessoal!!!
HEEEEEEEEEEEEEELPPPPPPPPPPPPP
fejohann
Amigo, ai vai uma classe completa… é de Administrador…
DAO
packageDAO;importjava.util.List;importorg.hibernate.Session;importmodel.Administrador;importorg.hibernate.Criteria;importorg.hibernate.Query;importorg.hibernate.Transaction;importutil.HibernateUtil;publicclassAdministradorDAO{privateSessionsession;publicAdministradorDAO(){session=HibernateUtil.getSession();}publicvoidinserir(AdministradorX){Transactiont=session.beginTransaction();session.save(X);t.commit();}publicvoidalterar(AdministradorX){Transactiont=session.beginTransaction();session.update(X);t.commit();}publicvoidexcluir(AdministradorX){Transactiont=session.beginTransaction();session.delete(X);t.commit();}publicList<Administrador>listar(){Criteriaselect=session.createCriteria(Administrador.class);returnselect.list();}publicAdministradorbuscar(AdministradorX){return(Administrador)session.load(Administrador.class,X.getAdm_cod());}publicbooleanlogin(Administradora){Queryq=session.createQuery("from Administrador where adm_cpf = :cpf and adm_senha = :senha");q.setParameter("cpf",a.getAdm_cpf());q.setParameter("senha",a.getAdm_senha());List<Administrador>lista=q.list();if(lista.size()>0){//System.out.print("verdadeiro");returntrue;}//System.out.print("falso");returnfalse;}}
Olá amigo!
Cara, desta vez parece que vai funfar, ele gerou a sequence certim lá no banco e tudo mais… só que agora ele tá me dando outro erro:
Essa é a parte final do erro:
E ele dá essa mensagem: Could not get the next sequence value!
Por favor, me ajuuuuudem… parece que agora vai!!!
fejohann
Cara, vc mudou o nome da seq em algum lugar?
parece q ele ta procurando por esse hibernate_sequence…
se mudou verifique se esta exatamente igual!
andre_bento
CONSEGUUUUUUUUUUUUUIIIIIIIIIIIIIIIIIIIIII!!!
Amigo, consegui finalmente resolver o erro!!!
Esse último é porque descobri que isso acontece quando o hibernate não consegue achar uma sequence e exibe o nome default hibernate_sequence…
Ae tem que mapear ela no arquivo hbm…
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><classname="modelo.Clientes"table="clientes"schema="public"><idname="id"type="integer"><columnname="id"/><generatorclass="sequence"><paramname="sequence">clientes_id_seq</param></generator></id><propertyname="nome"type="string"><columnname="nome"/></property><propertyname="cpf"type="string"><columnname="cpf"/></property></class></hibernate-mapping>
Feito isso, usei o código que vc me passou e funcionou legal cara!
Fiz um teste criando outro bd e tudo mais em outra classe e funfou legal agora!!
Como pode ser que apareçam pessou com o mesmo erro… lá vai o code!!!
DAO:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packageDAO;importjava.util.List;importjavax.swing.JOptionPane;importorg.hibernate.Criteria;importorg.hibernate.Query;importmodelo.Clientes;importorg.hibernate.Session;importorg.hibernate.SessionFactory;importorg.hibernate.Transaction;importorg.hibernate.cfg.Configuration;importorg.hibernate.criterion.Restrictions;/** * * @author Andre */publicclassDAOClientes{privatestaticSessionFactoryfactory;static{try{factory=newConfiguration().configure().buildSessionFactory();}catch(Exceptione){JOptionPane.showMessageDialog(null,"ERRO AO CONECTAR:"+e);}}publicstaticSessiongetSession(){returnfactory.openSession();}publicvoidinserir(Clientesc){Sessionsession=getSession();Transactiont=session.beginTransaction();session.save(c);JOptionPane.showMessageDialog(null,c.getId());t.commit();session.close();}publicvoiddelete(Clientesc){Sessionsession=factory.openSession();session.delete(c);session.flush();session.close();}publicClientesgetOne(Stringpk)throwsException{Sessionsession=getSession();Clientesc=newClientes();JOptionPane.showMessageDialog(null,pk);Transactiont=session.beginTransaction();Criteriaselect=session.createCriteria(Clientes.class);select.add(Restrictions.like("id",pk));List<Clientes>l=select.list();c.setNome(l.get(0).getNome());c.setCpf(l.get(0).getCpf());//c.setId(Integer.parseInt(l.get(0).getId()));returnc;}}
Classe:
packagemodelo;// Generated 14/10/2011 16:54:34 by Hibernate Tools 3.2.1.GAimportjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.SequenceGenerator;importorg.hibernate.annotations.Entity;/** * Clientes generated by hbm2java *///na compo name vc colocar o nome da sequencia que vc for usar dentro da classe... no nome sequenceName é o nome da sequencia no BANCO@Entity@SequenceGenerator(name="clientes_id_seq",sequenceName="clientes_id_seq")publicclassClientesimplementsjava.io.Serializable{privatestaticfinallongserialVersionUID=1L;@Id@GeneratedValue(strategy=GenerationType.AUTO,generator="clientes_id_seq")privateIntegerid;privateStringnome;privateStringcpf;publicIntegergetId(){returnthis.id;}publicvoidsetId(Integerid){this.id=id;}publicStringgetNome(){returnthis.nome;}publicvoidsetNome(Stringnome){this.nome=nome;}publicStringgetCpf(){returnthis.cpf;}publicvoidsetCpf(Stringcpf){this.cpf=cpf;}}
Cara, muuuuuuuuuuuuuito obrigado a vc amigo fejohann e a todos os amigos do fórum!!!
Valeu pessoal…
Um forte abraço!!
fejohann
Aeeee…
Nada não cara… o bom daqui (GUJ) é que você “ensina e aprende” o tempo todo…