JPA e Postgres

3 respostas
ronnypeterson

Estou engatinhando em JPA, tentei fazer um exemplo. Estou usando o Postgres 8.2 como base de dados. Então criei um tabela com a seguinte estrutura:

CREATE SEQUENCE seq_sushi;

CREATE TABLE sushi
(
  name varchar(20) NOT NULL,
  id SMALLINT DEFAULT NEXTVAL('seq_sushi'),  
  CONSTRAINT sushi_pkey PRIMARY KEY (id)
);

e minha classe Modelo está assim:

//imports...
@Entity
public class Sushi
{
  @Id
  @Column(insertable = false)
  private int id;
  private String name;

  //Getters e Setters...
}

Depois faço o cadastro de dois sushis, sendo q insiro apenas o name (não coloco valor p o id pq é sequence), mas a primeira vez e deu um erro. Fui Verificar no banco e cadastrou o primeiro sushi, mas o segundo sushi não tinha sido inserido. Fui ler o erro e vi a aplicação (JPA) estava tentando inserir o mesmo número de id (zero) do primeiro sushi para o segundo.

Resolvi testar inserindo numero de id diferentes para os dois e dessa vez ambos estão sendo inseridos, mas não quero passar número de id, quero q banco controle e gere essa sequencia.

Analisando o código acima, alguém poderia me ajudar. Estou fazendo algo errado?

Desde já agradeço a atenção e colaboração de todos!

3 Respostas

RaulCarlin

Dê uma olhada em @GeneratedValue(strategy=GenerationType.IDENTITY)…

Tem outros tipos, mas esse é o que permite que o campo auto incremebt do seu banco de dados seja utilizado.

ronnypeterson

Olá Raul, primeiramente muito obrigado pela resposta. Segundo alterei @Column(insertable = false) para @GeneratedValue(strategy=GenerationType.IDENTITY) , mas deu erro, então coloquei os dois juntos e deu erro novamente.

A msg de erro é a seguinte:

[TopLink Warning]: 2007.05.31 07:46:16.544–ClientSession(22057969)–Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2006.8 (Build 060830)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERRO: relação “sushi_id_seq” não existeError Code: 0
Call:select currval(‘SUSHI_ID_seq’)
Query:ValueReadQuery()

ronnypeterson

Consegui resolver!!! Tinha que criar o nome de minha sequencia no padrão de: _<nome do atributo que é sequencial>_seq.

Então ao invés de eu criar a sequencia com o nome seq_sushi , criei como sushi_id_seq e funcionou legal.

Mas para funcionar tem q colocar @Column(insertable = false) e@GeneratedValue(strategy=GenerationType.IDENTITY).

Agora tá funcionando q é uma maravilha, mas de qualquer muito obrigado Raul, sua dica me ajudou muito.

Criado 31 de maio de 2007
Ultima resposta 31 de mai. de 2007
Respostas 3
Participantes 2