Falha ao incluir dados no BD[Postgre] com Hibernate[anotations] utilizando Sequences
19 respostas
C
Crash_Overwing
Não consigo adicionar dados ao banco de dados com os “Id’s” em Sequencia
nao consigo formar um auto-increment com a Sequence …
Utilizo da seguinte forma
aqui no meu trampo a solução encontrada foi gerar a sequence assim:
if(objeto.getId()==null){
StringqueryString="select max(i.sequencia) from NomeEntidade i where i.id = ?";ShortitemMax=(Short)this.dao.executeQuery(queryString).
setInteger(0,objeto.getId().intValue()).
uniqueResult();if(itemMax==null){
itemMax=Short.parseShort("0");}
itemMax=Short.valueOf((short)(itemMax.shortValue()+Short.parseShort("1")));objeto.setSequencia(itemMax);}
bom, soluções melhores devem existir, entre as quais outros mapeamentos, mas a que posso te passar agora é essa
C
Crash_Overwing
hmm Entendi … Parece que é o unico Jeito mesmo … pois aqui o annotaton do Hibernate nao consegue puxar de jeito nenhum
a Sequence do Banco e Jogar no Objeto …
Se alguem souber outra soluçao ^^ …
note que eu anotei o generator na entity, não no campo. não sei se faz diferença, mas faz um teste ai.
[]'s
C
Crash_Overwing
Poiseh , Acho que nao faz diferença de declarar a SequenceGenerator abaixo da @Entity
Continua Dando o mesmo erro , ele parece que nao acha e Joga Nulo para o Campo ,
Acho que a solução vai ter que ser igual a do Tiburcio , creio que é o unico Jeito =\
JonathanSSantos
o problema ta que se tua sequencia tiver dentro de um schema… tu vai ter que informar este esquema
onde eu trampava antes com hibernate… o banco foi todo feito por um dba
é, tem que ver isso tbm, o meum banco usava o schema padrão, quando a gente tentou utilizar com schema ficava dando pau, mas era de sequence não encontrada no banco.
JonathanSSantos
mario.fts:
JonathanSSantos:
o problema ta que se tua sequencia tiver dentro de um schema… tu vai ter que informar este esquema
onde eu trampava antes com hibernate… o banco foi todo feito por um dba
é, tem que ver isso tbm, o meum banco usava o schema padrão, quando a gente tentou utilizar com schema ficava dando pau, mas era de sequence não encontrada no banco.
Sim… no meu tbm dava…
até que eu fiz dessa maneira e funcionou corretamente…
C
Crash_Overwing
Tive outro tipo de erro , pois antes estava declarando com :
e agora declaro com a strategy: @GeneratedValue(strategy= GenerationType.SEQUENCE, generator=“noffa.seq_video”)
ERROR (JDBCExceptionReporter.java:101) - ERRO: erro de sintaxe em ou próximo a "call"
Posição: 1
log4j:ERROR No output stream or file set for the appender named [R].
Exception in thread “main” org.hibernate.exception.SQLGrammarException: could not get next sequence value
alguem sabe me Informao motivo deste erro?
JonathanSSantos
Chicleteh:
Tive outro tipo de erro , pois antes estava declarando com :
e agora declaro com a strategy: @GeneratedValue(strategy= GenerationType.SEQUENCE, generator=“noffa.seq_video”)
ERROR (JDBCExceptionReporter.java:101) - ERRO: erro de sintaxe em ou próximo a "call"
Posição: 1
log4j:ERROR No output stream or file set for the appender named [R].
Exception in thread “main” org.hibernate.exception.SQLGrammarException: could not get next sequence value
alguem sabe me Informao motivo deste erro?
provavelmente ja tem um valor inserido no teu banco de dados e ele ta com o valor de inserção 1 e ja deve ter um valor no 1
tente verificar o ultimo valor inserido e ver se bate com o valor que tem na sua sequence no banco de dados!
Qlqer coisa manda msg denovo
se não for isso… verifica se com o .AUTO funciona e se nao funcionar… verifica se tu ta chamando a sequence certa no BD
C
Crash_Overwing
Realmente não sei o que é =\
nenhuma solução resolveu ..
o DAO salvando :
CREATE TABLE noffa.videos
(
id integer NOT NULL,
titulo character varying(64) NOT NULL,
descricao character varying(64) NOT NULL,
url character varying(64) NOT NULL
)
onde não ha registros nenhum ..
Desde Já agradeço a ajuda pessoal !
JonathanSSantos
Você colocou assim:
Eu ja tinha comentado ali emcima pra fazer deste modo:
log4j:WARN Are you using FileAppender instead of ConsoleAppender?
Hibernate: call next value for noffa."seq_video"
2009-12-15 23:46:38,276 ERROR (JDBCExceptionReporter.java:101) - ERRO: erro de sintaxe em ou próximo a "call"
Posição: 1
log4j:ERROR No output stream or file set for the appender named [R].
Exception in thread “main” org.hibernate.exception.SQLGrammarException: could not get next sequence value
JonathanSSantos
Chicleteh:
Mesmo erro , tambem n foi … =\
log4j:WARN Are you using FileAppender instead of ConsoleAppender?
Hibernate: call next value for noffa."seq_video"
2009-12-15 23:46:38,276 ERROR (JDBCExceptionReporter.java:101) - ERRO: erro de sintaxe em ou próximo a "call"
Posição: 1
log4j:ERROR No output stream or file set for the appender named [R].
Exception in thread “main” org.hibernate.exception.SQLGrammarException: could not get next sequence value
Tenta excluir a sequence e criar novamente meu…
Da um clean no teu projeto pra ver se ele nao ta pegando sujeira!
Tenta criar a sequence novamente e inserir… tenta em outro banco… cria um novo banco e cria as sequence pelo SchemaExport soh pra fazer um teste…
Dps poste seu feedBack
C
Crash_Overwing
Realmente não consegui , e isto esta acontecendo com qualqer Entidade que crio e tento Gerar o Auto-increment
Mas Agradeço a Ajuda ai Galera , Valeu a Força!
JonathanSSantos
Tenta fazer um debug na tua aplicação e ve o lugar exatamente onde está gerando o erro!
Valeu
J
javaCBA
Chicleteh
vc conseguiu resolver o problema???
ta acontecendo exatamente o mesmo erro comigo.
C
Crash_Overwing
.
DADO_CE
No meu caso foi só alterar o “hibernate.dialect” do hibernate.cfg, para o dialect do postgre: org.hibernate.dialect.PostgreSQLDialect
DADO
aquino.vale
Cara se vc estiver usando o Postgresql, normalmente isso aconteceo tipo da sua Id e diferente no banco, ai hibernate envia para o banco o valor 0 no campo id…
Tente deixar o campo id na classe como nulo, e veja se a seq e gerada, se o erro persistir tente criar uma trigger no banco
uma trigger before insert na tabela que vc esta usando e mande um
new.nome do campo id = (‘nome da seq’::regclass) // se for postgresql
return new;
desta forma o BD fica encarregado de alterar a sequencia, fazendo com o q o hibernate mande nao altera no banco…