Problema JPA + Oracle

Boa noite,

Eu estou tentando usar o JPA para persistir dados em um banco de dados Oracle 10g.

Quando tento inserir com o método persist a seguinte exceção é lançada:

java.lang.IllegalArgumentException: Object: dominio.Teste[id=1] is not a known entity type.

O que eu posso estar fazendo de errado?

Sql da tabela:

Classe de entidade:

[code]
@Entity
@Table(name = “TESTE”)
public class Teste implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = “ID”)
private BigDecimal id;
@Column(name = “NOME”)
private String nome;

//métodos setters e getters[/code]

Classe de teste:

[code]
Teste teste = new Teste();
teste.setId(new BigDecimal(“1”));
teste.setNome(“Pedro”);

EntityManagerFactory emf = Persistence.createEntityManagerFactory(“testePU”);
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(teste); //<------------- Linha em que o erro ocorre.
em.flush();
em.getTransaction().commit();
em.close();[/code]

Alguém pode me ajudar?

Obrigado Pessoal.

tive esse problema tbm. troquei o persiste por merge

Já experimentou trocar o BigDecimal pelo BigInteger?

Já tentei sim.

Troquei para BigInteger e Integer e o erro continuou.

Eu gerei essa classe de entidade pelo netbeans através do “Classes de entidades do banco de dados”.

Mapeia id Long ou Integer.

BigDecimal é para tipo Number.

melhorando o texto:
se você criou a tabela com “ID” INTEGER, tem que mapear como

@Column(name = "ID") private Integer id;

Use BigDecimal quando criar campo na tabela do tipo
"VALOR" NUMBER(12,2)

como a puka disse, eu acho que está dando incompatibilidade dos tipos…
Tenta Integer, Long…
já que no DB está integer

Eu cliquei em editar a tabela no enterprise manager do oracle e ele me diz que o campo ID é do tipo Number.Alterei para Integer e ele alterou com sucesso, só que quando clico para editar a tabela ele exibi de novo o campo ID como tipo number.

Isso é normal no Oracle?Não posso ter um campo primary key como Integer?

:?

então… é que o oracle meio que generaliza…
ele considera como number só que sem decimais…
é apenas o jeito dele tratar…

o problema seu é na persistência mesmo… você deve usar ou integer ou long… porque estes não possuem decimais…

Eu vou testar colocando o campo como Integer de novo quando chegar em casa e mais tarde eu coloco a resposta do que aconteceu aqui.

Obrigado pela ajuda até o momento pessoal.

Abs.

cara… na tabela, cria o campo id como NUMBER e na sua entidade usa Integer.

Consegui resolver o problema.

Eu estava criando o Persistence.xml pelo netbeans usando o EclipseLink e não estava funcionando.Depois gerei o Persistence.xml de novo pelo netbeans só que dessa vez usando o TopLink e funcionou.

O netbeans para o Eclipeplink criou o arquivo começando com “<persistence version=“2.0”…” e para o TopLink criou “<persistence version=“1.0”…”.

Com TopLink funciona e com o EclipseLink não.O que eu não entendi agora é que se eu chegar no arquivo persistence.xml do EclipseLink e alterar “<persistence version=“2.0”…” para “<persistence version=“1.0”…” ele funciona.

Alguém sabe me explicar porque isso acontece?

Persistence.xml gerado pelo Netbeans para o TopLink:

<?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 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="SePlagPU" transaction-type="RESOURCE_LOCAL"> <provider>oracle.toplink.essentials.PersistenceProvider</provider> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="toplink.jdbc.user" value="system"/> <property name="toplink.jdbc.password" value="oracle"/> <property name="toplink.jdbc.url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/> <property name="toplink.jdbc.driver" value="oracle.jdbc.OracleDriver"/> <property name="toplink.ddl-generation" value="create-tables"/> </properties> </persistence-unit> </persistence>

Persistence.xml gerado pelo Netbeans para o Eclipselink:

<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.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 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="SePlagPU" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/> <property name="javax.persistence.jdbc.password" value="oracle"/> <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/> <property name="javax.persistence.jdbc.user" value="system"/> <property name="eclipselink.ddl-generation" value="create-tables"/> </properties> </persistence-unit> </persistence>

Ninguém sabe?

Não sei o que pode ser.

Mas seria interessante verificar se o jar do EclipseLink que você usa é pra JPA 2.0 e o TopLink pra JPA 1.0. Pode ser que o Netbeans ‘veja’ JPA 2.0 no EclipseLink enquanto ela é, na verdade, JPA 1.0.

Não consegui achar nada de interessante na Internet. Quem sabe você poderia anexar um bug no site do NetBeans ou do EclipseLink (não sei em qual dos dois é o problema, mas acredito que seja no NetBeans). Você tentou fazer isso com a última versão (a Milestone 1 que saiu desse novo)?