Problemas ao persitir objetos

6 respostas
farzac

Ola Amigos

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:319
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 que alguem possa me ajudar ou alguem tenha outro codigo mais simples, quero apenas aprender persistir objetos.

Caso alguem ter algum codigo de persistencia de objetos e puder me passar.

Desde ja, muito obrigado.

6 Respostas

D

E ai jovem, tudo bem?

Cara… posso estar enganado, mas esse erro ocorre quando não tem o “@Entity” na entidade ou seu “persistense.xml” está configurado errado.

Dá uma conferida nos dois. =]

Espero ter ajudado. Até.

farzac

Ola amigo

O meu arquivo persistence.xml esta assim:

<?xml version="1.0" encoding="UTF-8"?> oracle.toplink.essentials.ejb.cpm3.EntityManagerFactoryProvider

Este codigo que postei eu consegui de um forum aqui do guj mesmo e pelo que percebi, na classe TestePersistencia ha uma linha que esta assim:

EntityManagerFactory emf = Persistence.createEntityManagerFactory(“TesteJPAPU”);

O que significa o TesteJPAPU

Desde ja, muito obrigado a quem puder me ajudar.

D

Bem… no seu persistence.xml tem uma linha assim:

&lt;persistence-unit name="TesteJPAPU" transaction-type="RESOURCE_LOCAL"&gt;

Este “TesteJPAPU” é o nome da sua persistence-unit. Ela serve para definir todas as configurações necessárias para o Hibernate iniciar, como configurações de acesso ao banco e as classes que são de entidade.

Por padrão, todas as classes que estão no seu CLASSPATH que possuem a anotação “@Entity” são incluídas na “lista” do Hibernate de entidades válidas. Se por algum acaso estas entidades estiver em um jar dentro do diretório lib realmente o Hibernate não vai encontrar as entidades.

Bem… aparentemente não há problemas na sua aplicação. Tente definir sua entidade dentro do persistence.xml com a seguinte linha:

&lt;class&gt;br.com.farzacsystem.Usuario&lt;/class&gt;

que deve ficar fora da tag <properties></properties>. Dê uma olhada na documetação do hibernate http://www.hibernate.org/hib_docs/entitymanager/reference/en/html/configuration.html.

Se mesmo assim não funcionar, talvez seja melhor vc começar com os exemplos do próprio Hibernate. Acho que fica mais fácil pra você começar a entender o mecanismo de funcionamento do hibernate.

Bem… espero que ajude. Até. =)

farzac

Amigo dmarcosm

Depois de muito tempo consegui persistir objetos, consegui graças a sua dica, realmente faltava informar
br.com.farzacsystem.Usuario

Agora estou com outro problema, quando persisto objeto com uma informacao, passando o nome, sobrenome e idade, na base do banco mysql, ao invez de criar um outro registro, é sempre atualizado o registro existente com as informacoes que acabei de passar, como se eu estivesse executadno um update nos dados que consta na base.

Sera que algo de errado na coluna ID da minha tabela que nao esta gerando numero sequencial.

Independente de voce souber me ajudar ou nao, muito obrigado pela dica.

Abraços.

D

E ai cara… beleza?

Bem… o método “persist” do Hibernate NÃO executa updates. Ele somente executa inserts. A questão é que como a estratégia de geração do ID que vc está usando é “IDENTITY”, isso diz que é responsabilidade do banco gerar os id.

O que você pode verificar é se você está passando o objeto para o Hibernate com o id SEMPRE nulo, pois somente assim o banco vai entender que deve ser gerado um novo ID.

Se vc estiver passando o ID com valor nulo e mesmo assim o banco não gerar um novo registro, provavelmente será alguma configuração no banco.

Tente acrescentar a tag

&lt;property name="hibernate.show_sql" value="true" /&gt;

ao seu persistence.xml. Ela vai mostrar todos os SQLs executados pelo Hibernate. Isso ajuda muito durante o desenvolvimento! Confere lá se o SQL de insert gerado pelo Hibernate está correto. =]

Espero ter ajudado. Até.

farzac

Ola amigo

Encontrei a solução para que ao persistir gere nova linha ao invez de apagar registro e criar um novo.

No persistence.xml

Onde ha a linha:

Eu alterei por esta:

Muito obrigado pelas dicas e como percebi que voce é uma pessoa que alem de ajudar tem um otimo conhecimento, eu vou precisar aprender web service, que é uma proxima etapa para que possa terminar meu sistema de gerar nota eletronica e enviar para receita.

Tem alguma dica sobre web service.

Desde ja, muito obrigado mesmo dmarcosm.

Abraços amigo.

Criado 12 de julho de 2008
Ultima resposta 15 de jul. de 2008
Respostas 6
Participantes 2