JPA e Postgres - Erro na persistência

Seguindo meus estudos em JPA, comecei a implementar a persitência de um relacionamento OneToMany em que um Sushi possui um Type e um Type possui vários Sushis.

No banco de dados está assim:

CREATE SEQUENCE type_id_seq;

CREATE TABLE type
(
  id SMALLINT DEFAULT NEXTVAL('type_id_seq'),
  description varchar(20) NOT NULL,    
  CONSTRAINT type_pkey PRIMARY KEY (id)
);

CREATE SEQUENCE sushi_id_seq;

CREATE TABLE sushi
(
  id SMALLINT DEFAULT NEXTVAL('sushi_id_seq') NOT NULL,  
  idtype SMALLINT NOT NULL,
  name varchar(20) NOT NULL,      
  CONSTRAINT sushi_pkey PRIMARY KEY (id),
  CONSTRAINT sushi_type_fkey FOREIGN KEY (idtype) references type

);

Então criei as duas classes modelos Type e Sushi:

@Entity
public class Type 
{
	@Id
	@Column(insertable = false)
	@GeneratedValue(strategy=GenerationType.IDENTITY) 
	private int id;
	private String description;
	
	//Representa todos os sushis que são desse tipo
	@OneToMany 
	private Collection<Sushi> sushis;
        ...
}

@Entity
public class Sushi
{
     @Id
     @Column(insertable = false)
     @GeneratedValue(strategy=GenerationType.IDENTITY)  
     private int id;
     private String name;  
  
     @ManyToOne (cascade = CascadeType.PERSIST) 
     @JoinColumn (name = "idtype") 
     private Type type;
  ...
}

//Classe client
public class Client 
{

  /**
   * @param args
   * @throws InterruptedException 
   */
  public static void main(String[] args) throws InterruptedException 
  {

    BaseDao<Sushi> dao = new BaseDao<Sushi>();    
    
    //Cria dois sushis
    Sushi hot = new Sushi();    
    hot.setName("SUSHI1");

    Sushi fil = new Sushi();    
    fil.setName("SUSHI2");
    
    //Cria um tipo
    Type type = new Type();
    type.setId(1);
    type.setDescription("TIPO1");
    
    //Faz a associação entre os dois objetos de sushi com o tipo criado
    hot.setType(type);
    fil.setType(type);
        
    dao.create(hot);
    dao.create(fil);
  }

}

Quando executo ele dá o seguinte erro:

[TopLink Warning]: 2007.06.01 08:55:14.999–ClientSession(6330655)–Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2006.8 (Build 060830)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERRO: relação “sequence” não existeError Code: 0
Call:UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
bind => [50, SEQ_GEN_SEQUENCE]
Query:DataModifyQuery()

Alguém pode me ajudar, pois não sei o q possa estar acontecendo…Desde já agradeço a atenção e colaboração de todos.

Cara primeiro vc tem q corrigir os nomes das tabelas pois no banco vc coloco-as em minusculo e como ñ colocou a anotação de @Table com um nome ele vai procura sua tabela como o nomde da classe.

e tenta com esta anotação aqui ao inves da q está usando

@GeneratedValue(strategy=GenerationType.SEQUENCE)

O problema está ocorrendo com a annotation @GeneratedValue. Tá dando erro quando ele tenta gerar a sequência, não sei exatamente o porque mas ele está procurando por uma tabela sequence, quando deveria procurar por uma SEQUENCE. Tenta deixar a annotation sem passar nada, o padrão é AUTO.

@Id @Column(insertable = false) @GeneratedValue private int id;

Isso deve resolver.

Robson, em relação as tabelas acho que não está havendo nenhum problema, pois entes já tinha testado dessa forma a persistência apenas de sushi e funcionou legal.

Agora vou tentar implentar sua sugestão e a do ifpolli e qualquer erro volto a postar, mas valeu pelas dicas.

Eu tive este mesmo problema com o TopLink em relação ao Postgres, quando troquei para o Hibernate não encontrei problema algum.

Michel, ainda estou meio q iniciando em formas mais avançadas de persistência. Por isso tenho uma dúvida em relação a sua sugestão: Vc falou em Hibernat, mas tipo…eu teria que parar de usar a API JPA e utilizar o Hibernat ou tenho q apenas mudar o .jar do JPA p um com Hibernat (como se fosse o JDBC em q tenho um para cada SGBD)???

Passei por problema semelhante na semana passada e isso resolveu.
A unica diferença é que minha pk era do tipo serial, ai o postgres cria uma sequence por debaixo dos panos.

Teoricamente isso deve funcionar pra voce.

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="cliente_cliente_id_seq")
    @Column(name = "cliente_id", nullable = false)
    private Integer clienteId;
CREATE TABLE cliente
(
  cliente_id serial NOT NULL,
  cliente_nome character varying(255) NOT NULL,
  cliente_senha character varying(255) NOT NULL,
  CONSTRAINT pk_cliente PRIMARY KEY (cliente_id)
) 
WITHOUT OIDS;
ALTER TABLE cliente OWNER TO henrique;

Se não funcionar o exemplo do henrik tenta este aqui que eu já usei em um projeto:

 @Entity
 @SequenceGenerator(name="SUSHI", sequenceName="sushi_id_seq",
                    initialValue=1, allocationSize=1)
 public class Type implements Serializable{

    @Id
    @Column(nullable = false)
    @GeneratedValue(generator="SUSHI",  strategy=GenerationType.SEQUENCE)
    private int id;

Muito a todos obrigado pela ajuda, vou testar essas novas dicas e daqui a pouco retorno com o resultado

[quote=ronnypeterson]Michel, ainda estou meio q iniciando em formas mais avançadas de persistência. Por isso tenho uma dúvida em relação a sua sugestão: Vc falou em Hibernat, mas tipo…eu teria que parar de usar a API JPA e utilizar o Hibernat ou tenho q apenas mudar o .jar do JPA p um com Hibernat (como se fosse o JDBC em q tenho um para cada SGBD)???

[/quote]

Você teria que utilizar os jar do Hibernate e mudar o persistence unit do seu arquivo persistence.xml para hibernate.

Mas primeiro testas os exemplos que te passaram, por que já faz um bom tempo que tive este problema e talvez o Toplink já tenha corrigido o mesmo …

Com o exemplo passado Henrik consegui resolver o problema. Mas agradeço a atenção e colaboração de todos vcs! VALEU!!!

Pessoal, a respeito dos modos de geração da annotation @GeneratedValue, isso é o que está na especificação JPA:

[quote]The types of primary key generation are defined by the GenerationType enum:
public enum GenerationType { TABLE, SEQUENCE, IDENTITY, AUTO };
The TABLE generator type value indicates that the persistence provider must assign primary keys for
the entity using an underlying database table to ensure uniqueness.
The SEQUENCE and IDENTITY values specify the use of a database sequence or identity column,
respectively.
The AUTO value indicates that the persistence provider should pick an appropriate strategy for the particular
database. The AUTO generation strategy may expect a database resource to exist, or it may
attempt to create one.[/quote]