Erro no sequence do Postgres

29 respostas
E

seguinte, estou com problemas de mapeamento de sequência para o postgres 8.1, segue o código do mapeamento da minha classe:

@Entity
@Table(name="tb_pcontrole_garagem", schema = "garagem")
public class Garagem implements Serializable {	

	private static final long serialVersionUID = 1L;

	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY) 	
	@Column(name="id_garagem", nullable = false)
	private Integer idGaragem;

dessa forma funciona perfeitamente no Postgres 8.4, más na versão 8.1 está dando o seguinte erro:

[color=red]dao.InvalidDataAccessResourceUsageException : could not get next sequence value; nested exception is org.hibernate.exception.SQLGrammarException [/color]

se alguém puder ajudar agradeço.

29 Respostas

G

Está faltando @SequenceGenerator para mapear sua sequence

E

isso fica no lugar do @GeneratedValue, ou mantem ele e add esse anotation?

E

Eu coloquei ele e mesmo assim está dando o erro, ficou assim o código

@Entity
@Table(name="tb_pcontrole_garagem", schema = "giac")
public class Garagem implements Serializable {	

	private static final long serialVersionUID = 1L;

	
	@Id
	@SequenceGenerator(name="tb_pcontrole_garagem_id_garagem_seq", sequenceName="tb_pcontrole_garagem_id_garagem_seq", allocationSize=1)  
	@GeneratedValue(strategy=GenerationType.IDENTITY) 	
	@Column(name="id_garagem", nullable = false)
	private Integer idGaragem;
G

tente:

@Entity
@Table(name="tb_pcontrole_garagem", schema = "giac")
public class Garagem implements Serializable {	

	private static final long serialVersionUID = 1L;

	
       @Id
       @SequenceGenerator(name = "seq", sequenceName = "tb_pcontrole_garagem_id_garagem_seq", allocationSize = 1)
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
	@Column(name="id_garagem", nullable = false)
	private Integer idGaragem;
E
Gustavo Sperandio:
tente:
@Entity
@Table(name="tb_pcontrole_garagem", schema = "giac")
public class Garagem implements Serializable {	

	private static final long serialVersionUID = 1L;

	
       @Id
       @SequenceGenerator(name = "seq", sequenceName = "tb_pcontrole_garagem_id_garagem_seq", allocationSize = 1)
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
	@Column(name="id_garagem", nullable = false)
	private Integer idGaragem;

Eu fiz assim, más continua dando o mesmo erro...

E

não sei se ajuda… más essa é a sequência que eu tenho no postgres:

CREATE SEQUENCE "giac"."tb_pcontrole_garagem_id_garagem_seq" INCREMENT 1 MINVALUE 1 MAXVALUE [telefone removido] START 1 CACHE 1;

G

Por algum acaso já existe registro nessa tabela?

E

Não tem, essa tabela está vazia

G

se for na mão da certo?

E

Sim, na mão insere normal.

D

faz o seguinte:

create a sequence

create sequence steste.seq_exemplo increment 1 start 1

atribui ela a tua tabela

create table steste.tbteste (
    id int not null default nextval('steste.seq_exemplo'::regclass)
);

e mapeia ela

@Entity
@Table(name="tbteste", schema = "steste")
@SequenceGenerator(name = "seq", sequenceName = "steste.seq_exemplo")
public class Garagem {
	
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
	private Integer idGaragem;

        // ...
}
A

Amigo eu uso PostgreSQL 8.4
mas tenta desta forma que dai o sistema pega o gerador automatico de sequencia do banco
coloque AUTO e não identity

@GeneratedValue(strategy=GenerationType.AUTO)
E
Diego.G.A:
faz o seguinte: create a sequence
create sequence steste.seq_exemplo increment 1 start 1
atribui ela a tua tabela
create table steste.tbteste (
    id int not null default nextval('steste.seq_exemplo'::regclass)
);
e mapeia ela
@Entity
@Table(name="tbteste", schema = "steste")
@SequenceGenerator(name = "seq", sequenceName = "steste.seq_exemplo")
public class Garagem {
	
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
	private Integer idGaragem;

        // ...
}

Então cara eu já criei a tabela assim, só coloquei esse anotation embaixo do @Table, e mesmo assim deu erro (o mesmo erro) o tipo da coluna do id está como serial (lá no postgre)

D

cara ja que esta como serial, ele cria a sequence automaticamente, tu tens que ver qual é o nome da sequence que ele cria e coloca na annotation sequenceName.

manda o stack trace do erro tbm.

E

esse é o erro que ele mostra no stack trace:

[RPC Fault faultString="org.springframework.dao.InvalidDataAccessResourceUsageException : could not get next sequence value; nested exception is org.hibernate.exception.SQLGrammarException: could not get next sequence value" faultCode="Server.Processing" faultDetail="null"] at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::faultHandler()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:345] at mx.rpc::Responder/fault()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\rpc\Responder.as:68] at mx.rpc::AsyncRequest/fault()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\rpc\AsyncRequest.as:113] at NetConnectionMessageResponder/statusHandler()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\messaging\channels\NetConnectionChannel.as:604] at mx.messaging::MessageResponder/status()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\messaging\MessageResponder.as:264]

Ele só mostra isso.

E

Esse é o que aparece no stack trace:

[RPC Fault faultString="org.springframework.dao.InvalidDataAccessResourceUsageException : could not get next sequence value; nested exception is org.hibernate.exception.SQLGrammarException: could not get next sequence value" faultCode="Server.Processing" faultDetail="null"] at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::faultHandler()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:345] at mx.rpc::Responder/fault()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\rpc\Responder.as:68] at mx.rpc::AsyncRequest/fault()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\rpc\AsyncRequest.as:113] at NetConnectionMessageResponder/statusHandler()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\messaging\channels\NetConnectionChannel.as:604] at mx.messaging::MessageResponder/status()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\messaging\MessageResponder.as:264]

só mostra isso

D

cara ve ai qual o nome da sequence que ele ta criando e posta ela aqui junto com o código da tua classe.

E

A sequência que ele está criando é essa: "tb_pcontrole_garagem_id_garagem_seq"

O meu código:

@Entity
@Table(name="tb_pcontrole_garagem", schema = "giac")
@SequenceGenerator(name = "seq", sequenceName = "tb_pcontrole_garagem_id_garagem_seq")
public class Garagem implements Serializable {	

	private static final long serialVersionUID = 1L;

	
	@Id	  
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "seq")	
	@Column(name="id_garagem", nullable = false)
	private Integer idGaragem;
	 //..
D

cara faz isso

@SequenceGenerator(name = "seq", sequenceName = "giac.tb_pcontrole_garagem_id_garagem_seq")
E
Diego.G.A:
cara faz isso
@SequenceGenerator(name = "seq", sequenceName = "giac.tb_pcontrole_garagem_id_garagem_seq")

Nada.. mesmo erro, ficou assim:

@Entity
@Table(name="tb_pcontrole_garagem", schema = "giac")
@SequenceGenerator(name = "seq", sequenceName = "giac.tb_pcontrole_garagem_id_garagem_seq")
public class Garagem implements Serializable {	

	private static final long serialVersionUID = 1L;

	
	@Id	  
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "seq")	
	@Column(name="id_garagem", nullable = false)
	private Integer idGaragem;
D

abre pgadmin clicla na tabela e da um print e manda ai.

E

Ai está:

D

ephram:
Ai está:

o proxy bloqueou a imagem,
manda o sql completo que o pgadmin cria

E

O SQL:

-- Table: giac.tb_pcontrole_garagem

-- DROP TABLE giac.tb_pcontrole_garagem;

CREATE TABLE giac.tb_pcontrole_garagem
(
  id_garagem integer NOT NULL DEFAULT nextval(('"giac"."tb_pcontrole_garagem_id_garagem_seq"'::text)::regclass),
  nome_fantasia character varying(40),
  cnpj character varying(18),
  r_social character varying(40),
  cliente_valido character(1),
  plano_selecionado character varying(25),
  valor_mensal real,
  CONSTRAINT tb_pcontrole_garagem_pkey PRIMARY KEY (id_garagem)
)
WITHOUT OIDS;
ALTER TABLE giac.tb_pcontrole_garagem OWNER TO hdit_bd_11;
D
-- DROP TABLE giac.tb_pcontrole_garagem;

CREATE TABLE giac.tb_pcontrole_garagem
(
  id_garagem integer NOT NULL DEFAULT nextval('giac.tb_pcontrole_garagem_id_garagem_seq'::regclass),
  nome_fantasia character varying(40),
  cnpj character varying(18),
  r_social character varying(40),
  cliente_valido character(1),
  plano_selecionado character varying(25),
  valor_mensal real,
  CONSTRAINT tb_pcontrole_garagem_pkey PRIMARY KEY (id_garagem)
)
WITHOUT OIDS;
ALTER TABLE giac.tb_pcontrole_garagem OWNER TO hdit_bd_11;

usa desse jeito ai

E
Diego.G.A:
-- DROP TABLE giac.tb_pcontrole_garagem;

CREATE TABLE giac.tb_pcontrole_garagem
(
  id_garagem integer NOT NULL DEFAULT nextval('giac.tb_pcontrole_garagem_id_garagem_seq'::regclass),
  nome_fantasia character varying(40),
  cnpj character varying(18),
  r_social character varying(40),
  cliente_valido character(1),
  plano_selecionado character varying(25),
  valor_mensal real,
  CONSTRAINT tb_pcontrole_garagem_pkey PRIMARY KEY (id_garagem)
)
WITHOUT OIDS;
ALTER TABLE giac.tb_pcontrole_garagem OWNER TO hdit_bd_11;

usa desse jeito ai

Fiz isso que você falou, más ele continua dando o mesmo erro... a única diferença é q a PK eu criei como integer (como no seu sql) más quando rodo o nextval ele muda automaticamente para serial, acho que isso está correto né?

D

ta certo sim

E

Diego.G.A , muito obrigado por ajudar más eu vou mudar o banco para o SQL Server, lá não da esse problema (e também na versão 8.4 do Postgre não acontece isso, testei aqui), depois quando estiver mais tranquilo eu vou pesquisar mais afundo o pq acontece esse erro no Postgre 8.1 e postar aqui no GUJ. Obrigado.

D

cara muda pra postgresql 8.4

eu faço assim

create sequence apoio.estado_id_seq increment 1 start 1;
create table apoio.estado (
	idEstado integer not null default nextval('apoio.estado_id_seq'::regclass),
	descricao varchar(50) not null,
	sigla char(2) not null,
	primary key (idEstado)
);
@Entity
@Table(schema="apoio", name="estado")
@SequenceGenerator(name="apoio.estado_id_seq", sequenceName="apoio.estado_id_seq")
public class Estado implements Serializable {

	@Id
	@GeneratedValue(generator="apoio.estado_id_seq", strategy=GenerationType.SEQUENCE)
	private Long idEstado;
Criado 24 de março de 2011
Ultima resposta 24 de mar. de 2011
Respostas 29
Participantes 5