Falha ao incluir dados no BD[Postgre] com Hibernate[anotations] utilizando Sequences

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

import org.hibernate.annotations.BatchSize;

@Entity
@Table(name="videos", schema="noffa")
@BatchSize(size=0)  


public class Video implements Serializable{



	private static final long serialVersionUID = 1L;

	@Id 
	@SequenceGenerator(name = "seq_video", sequenceName = "seq_video")
	@GeneratedValue(strategy=GenerationType.AUTO, generator="seq_video") 
	public Long id;
......

e me é Voltado os seguintes erros :

" ERROR (JDBCExceptionReporter.java:101) - ERRO: valor nulo na coluna “id” viola a restrição não-nula

Caused by: org.postgresql.util.PSQLException: ERRO: valor nulo na coluna “id” viola a restrição não-nula "

parece que o codigo nao consegue puxar a Sequencia e nao o adiciona …

Alguem ja passou por isso , ou possui alguma solução?

agradeço

aqui no meu trampo a solução encontrada foi gerar a sequence assim:

[code]
if (objeto.getId() == null) {

        String queryString = "select max(i.sequencia) from NomeEntidade i where i.id = ?";
        Short itemMax =
                (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);
    }[/code]

bom, soluções melhores devem existir, entre as quais outros mapeamentos, mas a que posso te passar agora é essa

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 ^^ …

Mass agradeço a Ajudaa, vlwss

cara, eu fiz assim e deu certo:

anotei os beans com :

[code]
@Entity
@SequenceGenerator(name = “SQ”, sequenceName = “sq_nomeDaSequence”)
public class Bean {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SQ")
    private Long id;
    ...

}[/code]

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

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 =\

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

e eu chamava a sequence assim:

@Id
@SequenceGenerator(name="sequence", sequenceName="teuSchema.\"tuaSequence\"")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence")
private Long teuID;

[quote=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

e eu chamava a sequence assim:

@Id @SequenceGenerator(name="sequence", sequenceName="teuSchema.\"tuaSequence\"") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence") private Long teuID; [/quote]

é, 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.

[quote=mario.fts][quote=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

e eu chamava a sequence assim:

@Id @SequenceGenerator(name="sequence", sequenceName="teuSchema.\"tuaSequence\"") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence") private Long teuID; [/quote]

é, 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.[/quote]

Sim… no meu tbm dava…

até que eu fiz dessa maneira e funcionou corretamente…

:smiley:

Tive outro tipo de erro , pois antes estava declarando com :

@GeneratedValue(strategy= GenerationType.AUTO, generator=“noffa.seq_video”)

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?

[quote=Chicleteh]Tive outro tipo de erro , pois antes estava declarando com :

@GeneratedValue(strategy= GenerationType.AUTO, generator=“noffa.seq_video”)

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?[/quote]

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

Realmente não sei o que é =
nenhuma solução resolveu …
o DAO salvando :

	public static void salvar(Video video){

			session = HibernateUtil.getSessionFactory().getCurrentSession();
			session.beginTransaction();
			session.save(video);
			session.getTransaction().commit();

	}
	[/code]

e meu bean :

[code]import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.BatchSize;

@Entity
@Table(name="videos", schema="noffa")
public class Video implements Serializable{


	private static final long serialVersionUID = 1L;

	@Id
	@SequenceGenerator(name = "seq_video", sequenceName = "seq_video")
	@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="seq_video") 
	public Long id;
	
	@Column(name="titulo")
	public String titulo;
	
	@Column(name="descricao")
	public String descricao;
	
	@Column(name="url")
	public String url;
	
	
	public Long getId() {
		return id;
	}
	
	public void setId(Long id) {
		this.id = id;
	}
	public String getTitulo() {
		return titulo;
	}
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	
	
	
}

e no banco minha sequence:

CREATE SEQUENCE noffa.seq_video
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;

e minha taBle :

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 !

Você colocou assim:

Eu ja tinha comentado ali emcima pra fazer deste modo:

@Id
@SequenceGenerator(name = "seq_video", sequenceName = "noffa.\"seq_video\"")
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="seq_video") 
public Long id;

Testa la e da um feedback…

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

[quote=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

[/quote]

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 :smiley:

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!

Tenta fazer um debug na tua aplicação e ve o lugar exatamente onde está gerando o erro!

Valeu :smiley:

Chicleteh

vc conseguiu resolver o problema???

ta acontecendo exatamente o mesmo erro comigo.

.

No meu caso foi só alterar o “hibernate.dialect” do hibernate.cfg, para o dialect do postgre: org.hibernate.dialect.PostgreSQLDialect

DADO

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…

Espero que ajude…