JPA + Toplink + PostgreSQL - ERRO

3 respostas
P

Olá pessoal!!

Sou novo no site e estou iniciando na programação web com J2EE e estou tendo problemas na hora de persistir e consultar dados em um banco de dados PostgreSQL. Eis o meu cenário:

Oracle TopLink Essentials - 2.0.1
GlassFish V2
PostgreSQL 8.2

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd">
 
  <persistence-unit name="Teste3PU" transaction-type="RESOURCE_LOCAL">
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <non-jta-data-source>Teste3PU</non-jta-data-source>
    <class>com.the3dtooh.Teste</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
      <property name="toplink.jdbc.driver" value="org.postgresql.Driver"/>
      <property name="toplink.jdbc.url" value="jdbc:postgresql://127.0.0.1:5432/teste"/>
      <property name="toplink.jdbc.password" value="1234"/>
      <property name="toplink.jdbc.user" value="3dtooth"/>
    </properties>
  </persistence-unit>
  
</persistence>

Tabela Teste do Banco

@Entity
@Table(name = "teste")
@NamedQueries({@NamedQuery(name = "Teste.findById", query = "SELECT t FROM Teste t WHERE t.id = :id"), @NamedQuery(name = "Teste.findByNome", query = "SELECT t FROM Teste t WHERE t.nome = :nome")})
public class Teste implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "id", nullable = false)
    private Short id;
    @Column(name = "nome")
    private Serializable nome;

    public Teste() {
    }

    public Teste(Short id) {
        this.id = id;
    }

    public Short getId() {
        return id;
    }

    public void setId(Short id) {
        this.id = id;
    }

    public Serializable getNome() {
        return nome;
    }

    public void setNome(Serializable nome) {
        this.nome = nome;
    }
}

E parte onde eu tendo acessar o banco

O que está acontecendo é que na hora que ele vai gravar no banca dá o seguinte Erro:

javax.persistence.RollbackException: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException Internal Exception: org.postgresql.util.PSQLException: ERROR: column "nome" is of type character varying[] but expression is of type bytea Error Code: 0 Call: INSERT INTO teste (id, nome) VALUES (?, ?) bind => [8, [B@1e8108e] Query: InsertObjectQuery(com.the3dtooh.Teste[id=8])

E quando eu tiro o controle de transação retorna este erro:

java.lang.IllegalArgumentException: Object: com.the3dtooh.Teste[id=5] is not a known entity type

Alguém faz idéia do qua pode ser?? Eu usei este mesmo código pra um banco Mysql e consegui fazer todas as operações de cadastrar e consultar e com o postgree não estou conseguindo.

Obrigado!!!

3 Respostas

E

Olá,
Na base de dados você diz que o tipo de dados da coluna “nome” é “character varying[]”, você tem de passar uma cadeia de caracteres ( “String” ) é esta a mensagem de erro.

Lavieri

leia esse artigo aki, que ele vai te ajudar muito a resolver facilmente essa situação…

Mensagens de erro são feias mas não mentem (nem mordem)
http://www.urubatan.com.br/mensagens-de-erro-sao-f...ias-mas-nao-mentem-nem-mordem/

leia a exceção…

javax.persistence.RollbackException: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException Internal Exception: org.postgresql.util.PSQLException: [size=18][color=red]ERROR: column "nome" is of type character varying[] but expression is of type byte[/color][/size] a Error Code: 0 Call: [b]INSERT INTO teste (id, nome) VALUES (?, ?) bind => [8, Query: InsertObjectQuery(com.the3dtooh.Teste[id=8])

era so ler a Exceção… que vc veria que o campo é o compo "nome" … veria que o erro é que ele esperava um tipo de caracter varying, e olhava pro seu objeto…

@Column(name = &quot;nome&quot;) private Serializable nome;

portanto veria que vc não precisa de um Serialize name, vc precisa de um array de chars…

a solução pode ser 2

@Column(name = &quot;nome&quot;) private String nome; //&lt;&lt;== essa é + indicada

@Column(name = &quot;nome&quot;) private char[] nome;

P

Olá pessoal!!

Primeiramente, muito obrigado mesmo pelas respostas.

Bom, na verdade eu já havia trocado o tipo do campo nome para string antes, e continuou dando erro do mesmo jeito, aí recriei a entidade através da geração automática do netBeans e ele gerou com esse tipo serializable. Mas eu acabei desistindo de usar o Postgre e resolvi ficar no bom e velho FireBirde mesmo, com o código quase igual a este deu certo de primeira, assim como eu havia testado com o mysql. Eu tenho uma certa urgência neste projeto em que estou trabalhando, por isso achei melhor ficar em uma área mais conhecida mesmo.

Ainda não desisti do Postgre, mas vai ter que ficar para uma outra ocasião!

Mutíssimo obrigado mesmo pelas respostas!!

Valeu Pessoal

Criado 20 de maio de 2009
Ultima resposta 21 de mai. de 2009
Respostas 3
Participantes 3