Erro ao Persisitir Objetos

6 respostas
farzac

Ola Pessoal

Estou tentando persistir objetos e estou com o seguinte erro:

init:
deps-jar:
compile:
run:
[TopLink Info]: 2008.07.09 11:56:20.765–ServerSession(21061094)–TopLink, version: Oracle TopLink Essentials - 2.0 (Build b41-beta2 (03/30/2007))
[TopLink Info]: 2008.07.09 11:56:22.765–ServerSession(21061094)–file:/D:/Meus%20Documentos/Projetos/PROJETO_PERSISTENCIA/JavaPersistencia/build/classes/-TesteJPAPU login successful
Exception in thread “main” java.lang.IllegalArgumentException: Object: br.com.farzacsystem.Usuario@56f631 is not a known entity type.
at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:3198)
at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.persist(EntityManagerImpl.java:190)
at br.com.farzacsystem.TestePersistencia.main(TestePersistencia.java:26)
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 17 segundos)

A minha classe Usuario esta assim:

package br.com.farzacsystem;

/**
*

  • @author zaccantte
    */
    import java.io.Serializable;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.NamedQueries;
    import javax.persistence.NamedQuery;
    import javax.persistence.Table;
@Entity

@Table(name = Usuario)

@NamedQueries

(

{

@NamedQuery(name = Usuario.findById, query = SELECT u FROM Usuario u WHERE u.id = :id),

@NamedQuery(name = Usuario.findByNome, query = SELECT u FROM Usuario u WHERE u.nome = :nome),

@NamedQuery(name = Usuario.findBySobrenome, query = SELECT u FROM Usuario u WHERE u.sobrenome = :sobrenome),

@NamedQuery(name = Usuario.findByIdade, query = SELECT u FROM Usuario u WHERE u.idade = :idade)

}

)

public class Usuario implements Serializable

{

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)

@Column(name = id, nullable = false)

private int id;
@Column(name = "nome", nullable = false)   
private String nome;   

@Column(name = "sobrenome", nullable = false)   
private String sobrenome;   

@Column(name = "idade", nullable = false)   
private int idade;   

public void setId(int id)
{
    this.id = id;
}
public int getId() 
{
    return this.id;   
}   

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

public String getNome() 
{
    return this.nome;   
}   

public void setIdade(int idade) 
{
    this.idade = idade;   
}   

public int getIdade() 
{
    return this.idade;   
}

public String getSobrenome() 
{
    return sobrenome;
}

public void setSobrenome(String sobrenome) {
    this.sobrenome = sobrenome;
}

}

A minha classe TestePersistencia esta asiim:

package br.com.farzacsystem;

import javax.swing.JOptionPane;   
import javax.persistence.*;   

public class TestePersistencia 
{
    public static void main(String[] args) 
    {
        String nome;   
        String sobrenome;   
        int idade;   

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("TesteJPAPU");   
        EntityManager em = emf.createEntityManager();   
        em.getTransaction().begin();   

        Usuario usr = new Usuario();   
        nome = JOptionPane.showInputDialog("Insira o Nome do Usuário:");   
        usr.setNome(nome);   
        sobrenome = JOptionPane.showInputDialog("Insira o Sobrenome do Usuário:");   
        usr.setSobrenome(sobrenome);   
        idade = Integer.parseInt(JOptionPane.showInputDialog("Insira sua idade:"));   
        usr.setIdade(idade);   

        em.persist(usr);// persist(usr);
        em.getTransaction().commit();   
        em.close();   
        emf.close();   
        JOptionPane.showMessageDialog(null,"ID: "+usr.getId()+"\nNome: "+usr.getNome()+   
        "\nSobrenome: "+usr.getSobrenome()+"\nIdade: "+usr.getIdade(),   
        "Usuário Persistido",JOptionPane.INFORMATION_MESSAGE);   
    }   
}

A estrutura da tabela esta assim:

mysql> desc usuario;

±-------------±-------------±-----±----±--------±-----------------+

| Field           | Type           | Null  | Key | Default | Extra               |

±-------------±-------------±-----±----±--------±------------------+

| ID              | int(11)         | NO   | PRI | NULL    | auto_increment |

| Nome         | varchar(60)  | NO   |       | NULL    |                        |

| Sobrenome | varchar(60)  | NO   |       | NULL    |                        |

| Idade         | int(11)          | YES  |       | NULL    |                        |

±-------------±--------------±-----±----±--------±-----------------+

4 rows in set (0.00 sec)

Espero qaue alguem possa me ajudar.

Abraços.

6 Respostas

R

Vc declarou a classe de entidade no persistence.xml ?
É necessário quando vc usa um AMEM (Application Managed Entity Manager).

Cabazzo

Tá faltando o construtor padrão public Usuario(){}.

R

A classe Usuario ao não definir nenhum construtor ganha do compilador um construtor automático, que equivale ao construtor sem argumentos.
Se não fosse assim a classe de teste nem compilaria.

Cabazzo

Não estou falando a respeito do compilador, já o erro: "java.lang.IllegalArgumentException: Object: br.com.farzacsystem.Usuario@56f631 is not a known entity type. " se refere que Usuario não é um objeto Entity válido. Mas oq parece é vc não colocou o id, já que ele é requerido.

M

Na verdade o problema está que sua tabela chama-se ‘usuario’ e na classe entity você colocou @Table(name = “Usuario”). Mude apenas para ‘usuario’ que é o nome correto da tabela.

ats,
Marcelo Soares

farzac

Marcelo

Como assim so o nome da tabela usuario?

Criado 9 de julho de 2008
Ultima resposta 9 de jul. de 2008
Respostas 6
Participantes 4