POSTGRES (Auto-Incremento) x Hibernate[RESOLVIDO]

11 respostas
T

Olá pessoas o/,

Eu fiz um pequeno script para popular minhas tabelas no postgres…até aki tudo bem, porém quando eu vou adicionar um novo valor na minha aplicacao web ocorre o seguinte erro :

[color=red]org.hibernate.exception.ConstraintViolationException: ERROR: duplicate key value violates unique constraint "materiais_pkey"
Detail: Key (id)=(1) already exists.[/color]

Alguém poderia me dar uma luz de como resolver esse pequeno desentendimento entre o postgres e o hibernate?

Agradeço desde já :D.

11 Respostas

A

cara,

vc tem que criar a seguinte sequence no postgres.

CREATE SEQUENCE hibernate_sequence
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 2760
  CACHE 1;
ALTER TABLE hibernate_sequence OWNER TO postgres;

T+

JuniorMaia

não sei na camada de persistência, mas no banco o teu atributo tem que ser Serial para auto-incrementar

T

O meu atributo é serial sim…

Por alguma razão a sequence não está atualizando…tavez seja porque eu inseri os ids na mão …:confused:

A

cara,

vc tem que anotar seu atributo id com as seguinte anotações @Id, @GeneratedValue

t+

wagnerfrancisco

ThaisGomes:
O meu atributo é serial sim…

Por alguma razão a sequence não está atualizando…tavez seja porque eu inseri os ids na mão …:confused:

Você não pode inserir na mão, tem que deixar ele usar o auto incremento. Você criou um objeto e setou o id e depois tentou salvar? Ou você inseriu registros no banco e preencheu o id?

T

Eu so coloquei à mão os ids no script

T

Segue a classe.....

@Entity
@Table
@Component("materiais")
public class Materiais implements Serializable,Menuable {
 
	private static final long serialVersionUID = -6689309046805642125L;
	public static final Integer MOVEL = 1;
	public static final Integer UTENSILIO = 2;
	public static final Integer FERRAMENTA = 3;
	public static final Integer EPI = 4;
	public static final Integer EPC = 5;
	public static final Integer MATERIAL_DE_SERVICO = 6;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column
	private Integer id;
	
	@Column
	private String codMaterial;
	
	@Column
	private String descMaterial;
	
	@Column
	private Integer tipoMaterial;
	
	@ManyToOne
	private UnidadeMedida unidadeMedida;
       
       //Getters an Setters
wagnerfrancisco

Lembre-se de atualizar a sequência no banco também então. Se a sequência começa de 1, mas você já inseriu um registro com id 1, deve garantir que o próximo número da sequência seja 2. No postgreSQL use a função setval para isto:

select setval('minha_sequencia', numero_do_id);
T

Muito obrigada wagnerfrancisco /o/

eu estava a procura desse bendito comando!!! :smiley:

wagnerfrancisco

ThaisGomes:
Muito obrigada wagnerfrancisco /o/

eu estava a procura desse bendito comando!!! :smiley:

De nada!

Você pode incluir ele no seu script também. Outra dica, se possível, é não informar o id no script, deixar o banco incrementar a sequência…

T

sim sim com certeza lembrarei de não colocar mas o id :D…e o comando já esta no meu script funcionando perfeitamente /o/

Criado 27 de agosto de 2012
Ultima resposta 27 de ago. de 2012
Respostas 11
Participantes 4